如何使用自定义AngularJS指令的“replace”function?

为什么replace=truereplace=false在下面的代码中没有任何影响?

为什么当replace = false时不显示“一些现有的内容”?

或者更加谦虚地说,你能不能很好的解释指令中的replace=true/false特性以及如何使用它?

JS /angular:

 <script> angular.module('scopes', []) .controller('Ctrl', function($scope) { $scope.title = "hello"; }) .directive('myDir', function() { return { restrict: 'E', replace: true, template: '<div>{{title}}</div>' }; }); </script> 

HTML:

 <div ng-controller="Ctrl"> <my-dir><h3>some existing content</h3></my-dir> </div> 

在这里看到Plunker:

http://plnkr.co/edit/4ywZGwfsKHLAoGL38vvW?p=preview

当你有replace: true你得到以下一块DOM:

 <div ng-controller="Ctrl" class="ng-scope"> <div class="ng-binding">hello</div> </div> 

而用replace: false你得到这个:

 <div ng-controller="Ctrl" class="ng-scope"> <my-dir> <div class="ng-binding">hello</div> </my-dir> </div> 

因此,指令中的replace属性指的是应该保留指令被应用到的元素( <my-dir> )是否应该保留( replace: false ),指令的模板应该作为其子类追加

要么

指令所应用的元素应该被指令的模板replacereplace: true )。

在这两种情况下,元素的(应用指令的)子元素将会丢失。 如果你想保持元素的原始内容/孩子,你将不得不将其变换。 下面的指令可以做到这一点:

 .directive('myDir', function() { return { restrict: 'E', replace: false, transclude: true, template: '<div>{{title}}<div ng-transclude></div></div>' }; }); 

在这种情况下,如果在指令的模板中有一个或多个具有ng-transclude属性的元素,则其内容将被该元素的原始内容(应用该指令)replace。

看到translusion的例子http://plnkr.co/edit/2DJQydBjgwj9vExLn3Ik?p=preview

看到这个阅读更多关于translusion。

replace:true被弃用

从文档:

replace ([DEPRECATED!])将在下一个主要版本中被移除 – 即v2.0)

指定模板应该replace的内容。 默认为false

  • true – 模板将replace指令的元素。
  • false – 模板将replace指令元素的内容。

– AngularJS综合指令API

从GitHub:

Caitp–它被弃用了,因为有一个已知的非常愚蠢的replace: true问题replace: true ,其中的一些问题不能真正以合理的方式被修复。 如果你小心避免这些问题,那么给你更多的权力,但为了新用户的利益,只要告诉他们“这会让你头痛,不要做”。

– AngularJS问题#7636