何时在Angular中使用transclude'true'和transclude'element'?


176

什么时候应该使用transclude: 'true'以及何时transclude: 'element'?我transclude: 'element'在Angular文档中找不到任何有关它们的信息,这非常令人困惑。

如果有人可以用简单的语言解释这一点,我将很高兴。每种选择的好处是什么?它们之间的真正区别是什么?

这是我发现的:

transclude: true

在编译函数中,您可以借助transclude链接函数来操作DOM,也可以使用任何HTML标记上的ngTransclude指令将已嵌入的DOM插入模板中。

transclude: element

这会包含整个元素,并且在编译函数中会引入一个包含链接功能。您无法在此处访问范围,因为尚未创建范围。编译函数为该指令创建了一个链接函数,该链接函数可以访问范围,而transcludeFn可以让您触摸克隆的元素(已被嵌入)以进行DOM操作或使用绑定到其中范围的数据。供您参考,这在ng-repeat和ng-switch中使用。

Answers:


229

AngularJS关于指令的文档中

transclude-编译元素的内容并使其可用于指令。通常与ngTransclude一起使用。包含的优点是链接功能接收一个预先绑定到正确作用域的包含功能。在典型的设置中,小部件创建隔离范围,但包含不是对象,而是隔离范围的同级。这使得小部件可以具有私有状态,并且可以将包含项绑定到父(预隔离)范围。

true -排除指令的内容。

'element' -排除整个元素,包括以较低优先级定义的任何指令。

超越:正确

因此,假设您有一个名为的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> {{...被排除并且可用于该指令。

包含:“元素”

如果您有一个名为my-transclude-element声明的指令,则该指令transclude: 'element'如下所示:

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

编译之后和链接之前,它变为:

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

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

链接后会发生什么?

这取决于您的指令使用transclude函数执行所需的操作。ngRepeat使用,transclude: 'element'以便在范围更改时可以重复整个元素及其子元素。但是,如果只需要替换标签并希望保留其内容,则可以transclude: truengTransclude为您执行此操作的指令一起使用。


3
我有点想念那made available to the directive句话。该元素始终可用于指令。您能详细说明一下吗?
Guy Mograbi

1
@guymograbi这句话可能更有意义,因为“ 通过预先绑定到正确范围的函数可用于指令”。
Michelle Tilley 2014年

一个单元如何测试包含等于“ element”的指令?我目前正在努力解决该问题。元素被排除后,我似乎无法访问它。
切斯特·里瓦斯

33

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

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


<div directive-name>world</div>

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


23
这根本没有回答问题(这是transclude: true和之间的区别transclude: element
Jasper 2014年

1
同样有趣的是,该指令后浏览器DOM具有哪些标签,而不是其读取的内容...
kontur

8

最好考虑画框的方法是画框。画框具有自己的设计和添加图片的空间。我们可以决定将哪些图片放入其中。在此处输入图片说明

当谈到角度时,我们有一种带有其范围的控制器,在其中,我们将放置一个支持转换的指令。该指令将具有自己的显示和功能。在非转写指令中,指令内部的内容由指令本身决定,但具有包含性,就像相框一样,我们可以决定指令内部的内容。

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>


还是我不明白这种超越,您能用任何简单的程序来说明这一点吗?
拉贾
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.