2013-06-18 86 views
7

我花了好幾個小時嘗試了這段代碼的微小變化,我不明白爲什麼一個工作,另一個不工作。我不明白角度數據綁定

以下是這個場景:我試圖展示一個註冊用戶列表(我用一個簡單的數據庫查詢返回的只是幾列),然後當一個用戶的名字被點擊時,我會從數據庫中檢索有關該用戶的更多信息,並以不同的視圖呈現它。目前,我正在使用ng-click指令定期執行<a>元素,該指令設置值爲currentid。在我的代碼中,我使用$watch()發送一個新的數據庫查詢,只要currentid發生變化。這部分似乎正在工作(我看到我的手錶回調輸出console.log(),數據庫查詢正在吐出正確的數據)...但有時currentid更改,有時它不會,我不明白爲什麼。

(點擊 「rmunn」 和 「admin」,在表中的鏈接:在下面的「當前ID」值應該更新,請原諒幾乎完全缺乏CSS;我是一個編碼員,而不是圖形設計師(「Dammit,Jim!」),現在我的時區也很晚,所以我沒有這個動機,它是功能性的,它證明了這個問題,並且我將要離開它。)

這兩者之間唯一的區別在於一個與currentid結合,另一個與vars.currentid結合。現在,我明白爲什麼綁定到currentid不適用於父母和孩子的範圍(孩子的價值會掩蓋父母的價值);因爲我來自Python背景,這對我來說很有意義(它類似於Python的實例命名空間如何影響類中定義的任何命名空間)。但在這個jsfiddle中,我只使用一個控制器 - 並不是所有這些變量都在同一個範圍內?

我一直在打我的頭這一切的一天,和幾個堆棧溢出的答案我試圖讀取(如How does data binding work in AngularJS?例如)剛離開我更糊塗了:$apply()$digest()和範圍,噢,我的!所以,如果任何人都可以給我一個很好的簡單的初學者指南來了解Angular的範圍(或者指出我已經寫過的一篇我錯過的),我會非常感激。

「我學過Clojure和Haskell,我可以學習一個簡單的Javascript框架,」我想。 「這很容易。」男孩,我錯了。 :-)

回答

4

您遇到了ng-repeat創建子範圍的問題。

<tr ng-repeat="user in data" blarg="{{user.id}}"> 
    <!-- currentid here is part of the ng-repeat child scope 
    and not your root scope --> 
    <td><a href="#{{user.id}}" ng-click="currentid = user.id">{{user.userName}}</a></td> 
    <td>{{user.email}}</td> 
</tr> 

如果您需要訪問父範圍可以使用$parent.currentid

<a href="#{{user.id}}" ng-click="$parent.currentid = user.id">{{user.userName}}</a> 

您需要使用$apply()只要您修改角世界之外的值。例如使用setTimeout()或jQuery插件。調用$apply()警報Angular重新評估scope以查看是否有更改並相應地更新。

+0

它在[ng-repeat documentation]中(http://docs.angularjs.org/api/ng.directive:ngRepeat) - 「這個指令創建了新的範圍。「我早先完全想到的五個小小的話語,其影響如此之大,謝謝,這完全解釋了我遇到的問題。 – rmunn