2017-02-15 18 views
2

AngularJS如何實現雙向數據綁定?模型更新的視圖是可以理解的,即它可以通過JS聽衆來實現,但我想了解模型來查看更新?由於核心角模型是js變量,所以Angular如何傾聽js變量的變化?Angular - 觸發2路數據綁定的摘要循環是什麼?

我知道每個模型都有一個手錶,它將新值與舊值進行比較,但觸發此檢查的是什麼(js實現)?

它使用JavaScripts觀察者還是檢查時間間隔?

+0

看看[數據綁定在角js](http://stackoverflow.com/questions/9682092/how-does-data-binding-work-in-angularjs) – Uday

+0

是的,我已閱讀它,但我沒有得到的部分是觸發這種骯髒的檢查。髒檢查通過摘要循環完成,對嗎?但是一旦模型被改變,角度如何觸發摘要循環? –

+0

只要Angular JS認爲有必要就像調用任何事件或者在Ajax調用返回之後調用$ digest()函數。但是有些情況下AngularJS不會爲你調用$ digest()函數,而且數據綁定不會增加顯示的值。在這種情況下,您必須通過調用$ scope。$ digest()或$ scope。$ apply()來手動執行此操作。 – Uday

回答

3

Angular定義了一個所謂Digest循環的概念。該週期可以被認爲是一個循環,在此期間,角度檢查是否有任何 更改由所有$範圍所監視的所有變量。因此,如果您的 在您的控制器中定義了$ scope.myVar並且該變量爲 標記爲被監視,那麼您明確告訴Angular 監視循環的每次迭代中myVar的更改。

基本上AngularJS結合事件處理程序與角($scopedirective,...),每一個事件觸發,$apply被調用時,其內部調用$digest交互的任何元素,這將觸發所有的重新評估$watches

AngularJS作出了明智的假設模型更改用戶交互/事件只發生:

  • DOM事件
  • XHR迴應射擊回調
  • 瀏覽器的位置改變
  • 定時器(setTimout,setInterval的)觸發回調

或觸發某些events

  • 輸入指令+ ngModel,ngClick,ngMouseOver等
  • $ http和$資源
  • $位置
  • $超時

enter image description here

當這些 '假設' 的一個被觸發,消化週期拉開序幕:

要引用Pawel Kozlowski,Mastering Web Application Development with AngularJS

AngularJS不使用任何類型的輪詢機制定期 支票模型變化

更詳細的洞察

看一看https://www.youtube.com/watch?v=SYuc1oSjhgY一個真正深入瞭解的消化週期。

+0

我不是在詢問角度實現,我想了解角度如何通過JS實現它。如果在視圖方面有變化,我們有JS事件監聽器像onChnage等,但我想知道它是如何完成的,如果一個模型被改變,即在模型被改變的任何ajax調用之後,角度如何知道模型被改變,時間調用$ apply? –

+0

好吧,我必須誤解你的問題的背景。我已經用一些額外的信息更新了我的答案。我不知道這是否更多地回答你的問題?感謝您指出! :) –