什么时候使用transclude'true'和transclude'element'在Angular中?

什么时候应该使用transclude: 'true'transclude: 'element' ? 我无法findtransclude: 'element'angulartransclude: 'element'中的transclude: 'element' ,他们很混乱。

如果有人能用简单的语言解释这个,我会很高兴。 每个选项有什么好处? 他们之间真正的区别是什么?

这是我发现的:

 transclude: true 

在一个编译函数内部,你可以使用transclude链接函数来操纵DOM,或者你可以在任何HTML标签上使用ngTransclude指令将transcluded DOM插入到模板中。

 transclude: 'element' 

这样跨越了整个元素,并且在编译函数中引入了跨链接function。 您无法访问范围,因为范围尚未创build。 编译函数为可以访问作用域的指令创build一个链接函数,transcludeFn让您触摸DOM操作的克隆元素(被转移)或者使用绑定到作用域的数据。 对于您的信息,这是用于ng-repeat和ng-switch。

从AngularJS指令文档 :

transclude – 编译元素的内容并使其可用于指令。 通常与ngTransclude一起使用。 转换的优点是链接函数接收到一个预先绑定到正确范围的转换函数。 在一个典型的设置中,小部件会创build一个隔离范围,但是该隔离不是一个孩子,而是隔离范围的一个兄弟。 这使小部件具有私有状态成为可能,并且将该跨部分绑定到父(预分离)范围。

true – transclude该指令的内容。

'element' – 涵盖整个元素,包括以较低优先级定义的任何指令。

transclude:真的

假设你有一个叫做my-transclude-true的指令,用transclude: true来声明,如下所示:

 <div> <my-transclude-true> <span>{{ something }}</span> {{ otherThing }} </my-transclude-true> </div> 

编译之后和链接之前变成:

 <div> <my-transclude-true> <!-- transcluded --> </my-transclude-true> </div> 

my-transclude-true内容 (子)是<span>{{ something }}</span> {{... ,被指令截取并可用。

transclude:“元素”

如果你有一个叫做my-transclude-element的指令,用transclude: 'element'声明,如下所示:

 <div> <my-transclude-element> <span>{{ something }}</span> {{ otherThing }} </my-transclude-element> </div> 

编译之后和链接之前变成:

 <div> <!-- transcluded --> </div> 

在这里, 包括孩子整个元素都被包含在内,并被提供给指令。

链接后会发生什么?

这取决于你的指令去做什么,它需要做的transcludefunction。 ngRepeat使用ngRepeat transclude: 'element'以便在范围更改时重复整个元素及其子元素。 但是,如果您只需要replace标记并希望保留它的内容,则可以使用ngTransclude transclude: truengTransclude指令为您执行此操作。

当设置为true时,指令将删除原始内容,但通过一个名为ng-transclude的指令使其可在模板中重新插入。

 appModule.directive('directiveName', function() { return { template: '<div>Hello there <span ng-transclude></span></div>', transclude: true }; }); <div directive-name>world</div> 

浏览器渲染:“你好,世界”。

思考跨越的最佳方式是一个相框。一个相框有自己的devise和添加图片的空间,我们可以决定什么样的图片会进入它的内部。 在这里输入图像说明

当涉及到angular度,我们有一个控制器的范围内,我们会发出一个指令,支持transclusion。 这个指令将有它自己的显示和function。 在非透明的指令中,指令内的内容由指令本身决定,但是如同图片框一样,我们可以决定指令内的内容。

 angular.module("app").directive('myFrame', function () { return { restrict: 'E', templateUrl:"frame.html", controller:function($scope){ $scope.hidden=false; $scope.close=function(){ $scope.hidden=true; } }, transclude:true } }); 

指令内的内容

 <div class="well" style="width:350px;" ng-hide="hidden"> <div style="float:right;margin-top:-15px"> <i class="glyphicon glyphicon-remove" ng-click="close()" style="cursor:pointer"></i> </div> <div ng-transclude> /*frame content goes here*/ </div> </div> 

呼叫指令

 <body ng-controller="appController"> <my-frame> <span>My Frame content</span> </my-frame> </body>