当我们没有指定scope:true
(new Scope) 或scope:{}
(isolatedScope) 并且我们重新使用该指令时,在作用域上定义的属性将被覆盖。
例如:
<div ng-controller="AppCtrl">
<my-control name="myControl1">
Some Content: {{value}}
My Control Name: {{name}}
</my-control>
<my-control name="myControl2">
Some Content: {{value}}
My Control Name: {{name}}
</my-control>
</div>
它不会同时在屏幕上打印,而是打印myControl1
两次。myControl2
myControl2
PLNKR
要克服此问题,请尝试以下任何解决方案。
解决方案1
transclde:true
将创建一个新的范围。在此范围而不是指令的范围上设置属性。
app.directive('myControl', function() {
return {
restrict: 'E',
transclude: true,
template: '<div><p><strong>Welcome to the testMe directive!</strong></p> <div ng-transclude></div></div>',
link: function(scope, element, attrs) {
var transclusionTarget = element[0].querySelector('[ng-transclude]').firstChild;
var transclusionScope = angular.element(transclusionTarget).scope();
transclusionScope.name = attrs.name;
}
}
});
在这里,div 下的元素ng-transclude
将使用 transclusionScope 进行编译,抓取它并更新其中的属性。
PLNKR
解决方案
2 而不是使用ng-transclude
,手动嵌入内容。
app.directive('myControl', function() {
return {
restrict: 'E',
transclude: true,
template: '<div><p><strong>Welcome to the testMe directive!</strong></p> <div transclude-target></div></div>',
link: function(scope, element, attrs, directiveCtrl, transcludeFn ) {
var transclusionScope = scope.$new(),
transclusionTarget = element[0].querySelector('[transclude-target]');
transclusionScope.name = attrs.name;
transcludeFn(transclusionScope, function (clone) {
angular.element(transclusionTarget).append(clone);
});
}
}
});
在这里,new Scope
使用scope.$new()
. 并更新其中的属性。
PLNKR
解决方案 1可能不适用于所有情况。当我们访问时firstChild
,如果它还没有准备好,Solution1 将失败。
解决方案2 更干净,适用于所有情况。