gpt4 book ai didi

javascript - Angular 如何处理具有多个指令的元素

转载 作者:行者123 更新时间:2023-11-30 16:49:19 25 4
gpt4 key购买 nike

如果一个元素有多个指令,一个使用 scope:false,一个使用 scope:true,一个使用 scope:{}, Angular 是如何处理这个元素的?

最佳答案

如果您在同一元素上包含所有三个要求所有三个范围选项的指令,则会出现错误。 truefalse 兼容并使用相同的范围,但添加 {} 会导致:

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:{},它工作正常,您可以看到 falsetrue 范围共享。我没有调查过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com