如果一个元素有多个指令,一个使用 scope:false
,一个使用 scope:true
,一个使用 scope:{}
, Angular 是如何处理这个元素的?
最佳答案
如果您在同一元素上包含所有三个要求所有三个范围选项的指令,则会出现错误。 true
和 false
兼容并使用相同的范围,但添加 {}
会导致:
Error: [$compile:multidir] Multiple directives [isolatedScope, trueScope]
asking for new/isolated scope on:
<div false-scope="" true-scope="" isolated-scope="">
在这种情况下,true
和 {}
会在 true
尝试创建新的继承范围和 {} 时发生冲突
尝试创建一个新的、独立的范围,这是合理的,也许是预期的。 $compile docs说:
If multiple directives on the same element request a new scope, only one new scope is created.
如果您有多个带有 scope: true
的指令,它们很好,您只得到一个,但是 scope: {}
要求另一种,而 Angular不能同时产生。指令可以声明为 priority
,因此他们可以悄悄地选出获胜者,但这会导致各种意外,因此他们明智地决定大声疾呼。
这是 a Plunker证明它。我将所有三个作用域放在一个 div
上,然后使用父作用域中可用的数据在每个作用域中声明数据。如果您注释掉 scope:{}
,它工作正常,您可以看到 false
和 true
范围共享。我没有调查过 false
还是 true
胜出,但我怀疑 true
因为它指示 $compile
需要一个新的范围。
HTML:
<body ng-controller="MainCtrl">
<div false-scope true-scope isolated-scope>
<b>False directive</b>
<ul>
<li>Loaded: {{ falseDirectiveLoaded }}</li>
<li>Data: {{ falseDirectiveData }}</li>
</ul>
<b>True directive</b>
<ul>
<li>Loaded: {{ trueDirectiveLoaded }}</li>
<li>Data: {{ trueDirectiveData }}</li>
</ul>
<b>Isolated directive</b>
<ul>
<li>Loaded: {{ isolatedDirectiveLoaded }}</li>
<li>Data: {{ isolatedDirectiveData }}</li>
</ul>
</div>
</body>
JS:
app.controller('MainCtrl', function($scope) {
$scope.one = 1;
$scope.two = 2;
$scope.three = 3;
});
app.directive('falseScope', function() {
return {
restrict: 'A',
scope: false,
link: function(scope, element) {
scope.falseDirectiveLoaded = true;
scope.falseDirectiveData = [scope.one, scope.two, scope.three];
}
}
});
app.directive('trueScope', function() {
return {
restrict: 'A',
scope: true,
link: function(scope, element) {
scope.trueDirectiveLoaded = true;
scope.trueDirectiveData = [scope.one, scope.two, scope.three];
}
}
});
app.directive('isolatedScope', function() {
return {
restrict: 'A',
scope: {},
link: function(scope, element) {
scope.isolatedDirectiveLoaded = true;
scope.isolatedDirectiveData = [scope.one, scope.two, scope.three];
}
}
});
关于javascript - Angular 如何处理具有多个指令的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759279/