正如其他人回答,短期解決方案是使用ng-show
而不是ng-if
或不使用$compile
這樣。除此之外,你可能有你的理由,你爲什麼要這樣使用ng-if
和$compile
。
這個問題讓我感興趣的是使用$compile
的注意事項,隔離範圍從ng-if
。我對this fork做了一些嘗試,並試圖解釋我發現的內容。
我們已經知道ng-if
創建隔離範圍,但隨後通過該元素與ng-if
它通過$compile
創建另一隔離範圍(並會作出新編譯ng-if
在看第一輪變量分離範圍 - 該指令的值爲$scope
)。
再次重申的是,我們遇到一些範圍看上去像(在[]的值範圍的$ id。):
主/外控制器具有scope[2]
ng-if my-test
元件有ng-if
看着scope[2].count
並創建因此scope[3]
my-test
接頭具有$scope.$id == 3;
my-test
確實$compile
- 重新編譯ng-if
元素:創建新的分離scope[4]
,並期待在scope[3].count
時scope[2].count
命中0 - scope[3]
得到$destroyed
(因爲scope[3]
是由第一ng-if
創建這仍然是揮之不去在某處)......但是!元素是A.仍在那裏和B.它的計數沒有更新 - 爲什麼?
好,因爲這是該元素還有一個,這是$compiled
並具有A.一個ng-if
看着scope[3].count
(現在$破壞)和B.自己的新菌株scope[4]
(通過重新編譯創建ng-if
元素與父母scope[3]
)
所以你。這一切都很混亂,你可能會問......我該如何解決這個問題?
TL; DR;
最簡單的辦法: $element.removeAttr('ng-if');
之前,你做$compile($element)($scope);
如果你一直在下面,這工作,因爲原來的ng-if
仍在尋找在scope[2].count
,那就是目前的元素不再是得到一個第二隔離範圍。
這非常有幫助,謝謝。其他內置指令是否創建了一個獨立的作用域,如ng-if?如果我碰巧在我的指令旁邊使用ng-repeat或甚至是定製/第三方指令,我是否可能再次遇到同樣的問題? –
很高興它有幫助!一些內置和第三方指令確實創建了隔離範圍。您只需查看您計劃使用的每條指令的文檔。例如,[ng-if docs](https://docs.angularjs.org/api/ng/directive/ngIf)表示「此指令創建新範圍。」 (在Directive Info部分下)和[ng-repeat docs]一樣(https://docs.angularjs.org/api/ng/directive/ngRepeat),但你會看到[ng-show](https:// docs .angularjs.org/api/ng/directive/ngShow)(例如)不。 – plong0