删除更换:在该指令真正的名字 'LW' ..
这也应该解决。
更新小提琴:updated fiddle
app.directive('lw', function(){
return {
restrict: 'E',
scope: {
items: "="
},
template: '<listie items="items"></listie>',
controller: function($scope) {
}
}
});
分析:
是什么原因造成的问题?
用lw指令替换为true会发生什么是lw有隔离作用域,现在作为替换= 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));
}
}
以上是这是否检查功能,并且如果万一有分配两个作用域到相同元件的尝试它甩这个错误。 所以这就是它被设计成的样子,而不是一个错误。
为什么要替换:真正的删除解决了这个问题?
通过删除replace:true发生了什么,而不是新的指令listie被替换为lw,它被附加到它中,所以它是一个独立的作用域嵌套到另一个中,这是绝对正确和允许的。 嵌套的分离范围是像
<lw items="items" class="ng-isolate-scope">
<div items="items" class="ng-isolate-scope">
..........
</div>
</lw>
为什么包装在一个div也将工作(这是你认为是解决方法解决方案)?
要注意的一点是,div不是具有单独隔离范围的元素。它只是一个元素。 这里取代你将连接到div的隔离范围。 (注意:div本身没有隔离范围),所以没有2个隔离范围连接 到相同的元素div。 因此没有重复,因此断言步骤通过并开始工作。
所以这就是它是如何设计的工作,绝对不是一个错误。
圣牛,真棒回答,谢谢! –
为了保持'replace:true'功能,我选择使用div来包装模板。它解决了这个问题,由此产生的html与'replace:true'是“更干净”。感谢你的回答! –
感谢这个简短的解释!你为我节省了很多时间! –