现在,更新的AngularJS 1.6.6文档有了更好的解释。
Transclude用于创建包装其他元素的指令
有时,希望能够传递整个模板而不是字符串或对象。假设我们要创建一个“对话框”组件。该对话框应该能够包装任意内容。
为此,我们需要使用transclude选项。请参考以下示例。
script.js
angular.module('docsTransclusionExample', [])
.controller('Controller', ['$scope', function($scope) {
$scope.name = 'Tobias';
}])
.directive('myDialog', function() {
return {
restrict: 'E',
transclude: true,
scope: {},
templateUrl: 'my-dialog.html',
link: function(scope) {
scope.name = 'Jeff';
}
};
});
index.html
<div ng-controller="Controller">
<my-dialog>Check out the contents, {{name}}!</my-dialog>
</div>
my-dialog.html
<div class="alert" ng-transclude></div>
编译输出
<div ng-controller="Controller" class="ng-scope">
<my-dialog class="ng-isolate-scope"><div class="alert" ng-transclude="">Check out the contents, Tobias!</div></my-dialog>
</div>
Transclude使具有此选项的指令的内容可以访问指令外部而不是内部的作用域。
在前面的示例中对此进行了说明。请注意,我们在script.js中添加了一个链接功能,该功能将名称重新定义为Jeff。通常,我们希望{{name}}是Jeff。但是,在此示例中,我们看到{{name}}绑定仍然是Tobias。
最佳实践:仅transclude: true
在要创建包装任意内容的指令时使用。