删除 replace: true 在指令上的名称 'lw' ..
这也应该解决。
更新小提琴:updated fiddle
app.directive('lw', function(){
return {
restrict: 'E',
scope: {
items: "="
},
template: '<listie items="items"></listie>',
controller: function($scope) {
}
}
});
分析:
是什么导致了问题?
对于 lw 指令使用 replace=true 会发生什么是 lw 具有隔离范围,现在作为 replace=true ,本身具有隔离范围的被替换元素被尝试在那里替换,所以你在不知不觉中所做的是你试图给同一元素列表的两个作用域。
angular.js 1.2.1 版中的代码级观察:
第 5728 行:函数 applyDirectivesToNode 是在指令上执行编译的函数,在第 5772 行,他们会检查我们是否尝试分配重复的范围,或者换句话说,具有两个范围的相同元素。
function assertNoDuplicate(what, previousDirective, directive, element) {
if (previousDirective) {
throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',
previousDirective.name, directive.name, what, startingTag(element));
}
}
above 是执行该检查的函数,如果尝试将两个范围分配给同一个元素,它会抛出该错误。
所以这就是它的设计方式,而不是错误。
为什么replace:true删除能解决问题?
通过删除 replace:true 发生的事情不是新指令 listie 被替换而不是 lw ,它被附加到其中,因此它是一个嵌套在另一个范围内的孤立范围,这是绝对正确和允许的。
嵌套的隔离范围就像
<lw items="items" class="ng-isolate-scope">
<div items="items" class="ng-isolate-scope">
..........
</div>
</lw>
为什么包装在 div 中也可以工作(这是您认为可以解决的解决方案)?
需要注意的一点是,div不是一个有独立作用域的元素,它只是一个元素。
在此处替换您将附加 lw 的隔离范围以附加到 div 。 (注意: div 本身没有隔离范围),因此没有附加 2 个隔离范围
到相同的元素 div 。
所以没有重复,因此断言步骤通过并开始工作。
所以这就是它的设计工作方式,绝对不是错误。