如何使用自定义AngularJS指令的“replace”function?
为什么replace=true
或replace=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
),指令的模板应该作为其子类追加 ,
要么
指令所应用的元素应该被指令的模板replace ( replace: 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