2013-03-30 157 views
16

Please check this plnkr簡單angularjs隔離範圍嵌套指令

我已閱讀everyhting可以找到有關指令,範圍和隔離範圍。但我仍然無法理解這種工作方式。

只要它不嵌套在另一個指令中,我創建的指令就可以完美工作。

當嵌套時,'localFunc:'& func「'屬性綁定到外部控制器作用域就好了,但'localAttr:'= attr''作用域失敗。

我會永遠感激的是,任何人都可以幫助我理解爲什麼。

回答

32

形象地,這裏是你的範圍是什麼樣子之前,我們鍵入文本兩種: scopes

注意隔離範圍006的母公司是由指令container創建的transcluded範圍。因此,範圍006中的searchText將被數據綁定到範圍005(而不是範圍003),因爲正在使用基元。

如果我們輸入11到第一個文本框,並22進入第二個文本框,並再次檢查範圍,我們可以看到在數據綁定發生了:

enter image description here

searchforThis2在範圍005色的黃色以表明已創建新的財產。發生這種情況是因爲使用了一個原語 - 範圍005在這裏不使用原型繼承,它只是爲它自己創建一個新的原始屬性(即它不在範圍003中查找屬性名稱)。其他黃色項目表示原始值已更改。

正如您已經發現的那樣,此問題的「最佳實踐」解決方案是綁定到父作用域中的對象屬性(而非基元)(即作用域003)。

在你的控制器使用以下:

$scope.obj = {searchforThis1: "Sample Text 1", searchforThis2: "Sample Text 2"}; 

,並在你的HTML:

<search searchtext="obj.searchforThis1"...> 
... 
<div container> 
    <search searchtext="obj.searchforThis2"...> 

作用域現在看起來如下: enter image description here

如果我們輸入11進入第一個文本框和22放入第二個文本框並再次檢查範圍,我們可以看到t他的數據綁定發生了:

enter image description here

因爲範圍006是分離的範圍,它使用$parent去範圍005(如上)。但是,從那裏開始,原型繼承就在發揮作用,因爲我們不使用原始類型。對象屬性searchforThis2位於範圍003.

+0

明智的解釋。謝謝。 您是僅僅爲這個問題繪製這些圖表還是您有一些工具可以檢查angularjs範圍並準備這些圖表? – thrag

+2

@thrag,我有一個我寫/正在寫的工具。 –

+5

@MarkRajcok您可否考慮公開發布此工具,以便我們可以動態繪製這些精彩的示波器地圖?我相信很多頭痛可以避免,許多長時間的談話會被保存:) –

3

永不失敗。小時的谷歌搜索沒有任何結果,直到我實際輸入問題,然後我搜索關鍵字和瞧!答案就會出現。

感謝this very illuminating post我知道我的問題非常常見,甚至有一個名稱 - 「點規則」。

基本上你需要引用控制器上的繼承對象而不是屬性,問題就消失了。

+3

從角度github wiki有益閱讀https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance – charlietfl

+1

感謝您的參考那'非常有啓發性'! – Airn5475