什么时候使用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: true
与ngTransclude
指令为您执行此操作。
当设置为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>
例