刪除更換:在該指令真正的名字 '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'是「更乾淨」。感謝你的回答! –
感謝這個簡短的解釋!你爲我節省了很多時間! –