對Angular中單向數(shù)據(jù)流的深入理解
變更檢測
Angular 中,數(shù)據(jù)是由頂部根節(jié)點流向最后的葉子節(jié)點,整個數(shù)據(jù)流是單向,構成一顆單向樹。
Angular 認為所有的異步操作都有可能會引起模型的變化,引起數(shù)據(jù)模型發(fā)生變化的事件源有:
- Events:click, mouseover, keyup ...
- Timers:setInterval、setTimeout
- XHRs:Ajax(GET、POST ...)
Angular 封裝 Zone來攔截跟蹤異步,一旦發(fā)現(xiàn)異步行為,Angular 就會進行變更檢測。
因為數(shù)據(jù)流是單向的,組件的數(shù)據(jù)來源只能由父組件進行傳入,所以 Angular 會從上到下,廣度遍歷檢測組件,只要父組件檢測完畢就能繼續(xù)檢測子組件。而相比 angularjs,雙向、混亂的數(shù)據(jù)流方向,會導致重復變更檢測重復多次,直到數(shù)據(jù)穩(wěn)定,可能會導致性能問題,或者出現(xiàn)數(shù)據(jù)和視圖處于不一致的狀態(tài),即渲染過程完成后的視圖不能反映數(shù)據(jù)的實際狀態(tài)。
渲染輸出
當檢測到數(shù)據(jù)模型變化時,組件需要重新渲染,Angular將運行它的 DOM 生成函數(shù),該函數(shù)會生成一個新的 DOM數(shù)據(jù)結構,該結構對應于組件 View 的新版本。
Angular 在渲染過程中,評估模板表達式并在整個組件樹中調用生命周期鉤子。
注意:綠色標志會多次調用
從生命調用周期來看(綠色有向線),ngAfterViewChecked 標示該組件及子組件視圖輸出完成??匆韵乱焕樱?br />
import {Component, AfterViewChecked} from '@angular/core'; import {Course} from "./course"; @Component({ selector: 'app-root', template: ` <div class="course"> <span class="description">{{course.description}}</span> </div> `}) export class AppComponent implements AfterViewChecked { course: Course = { id: 1, description: "Angular For Beginners" }; ngAfterViewChecked() { this.course.description += Math.random(); } }
上述代碼會在Angular變更檢測周期發(fā)生錯誤。組件已經完成 DOM 數(shù)據(jù)結構輸出,我們還在該組件 ngAfterViewChecked() 方法中修改了數(shù)據(jù)狀態(tài)。這樣導致了視圖渲染后,數(shù)據(jù)跟視圖狀態(tài)不一致。
數(shù)據(jù)從組件類流向表示它們的DOM數(shù)據(jù)結構,生成這些DOM數(shù)據(jù)結構的行為本身就不會導致數(shù)據(jù)的進一步修改。但我們在 ngAfterView 生命周期發(fā)生修改數(shù)據(jù)行為,Angular 的“單向數(shù)據(jù)流”規(guī)則禁止在一個視圖已經被組合好之后再更新視圖。
這意味著數(shù)據(jù)模型到視圖過程是單向,不可在視圖后發(fā)生數(shù)據(jù)流發(fā)生改變。
總結
從變更檢測過程以及渲染輸出過程中,可以總結出:
單向數(shù)據(jù)流指的是從組件樹的頂部到底部渲染掃描過程中應用程序數(shù)據(jù)流轉到由渲染過程生成的輸出DOM數(shù)據(jù)結構的流程。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
AngularJS框架的ng-app指令與自動加載實現(xiàn)方法分析
這篇文章主要介紹了AngularJS框架的ng-app指令與自動加載實現(xiàn)方法,結合實例形式分析了ng-app指令的功能及自動加載機制的實現(xiàn)技巧,需要的朋友可以參考下2017-01-01詳解為Angular.js內置$http服務添加攔截器的方法
所謂攔截器就是在目標達到目的地之前對其進行處理以便處理結果更加符合我們的預期。Angular的$http攔截器是通過$httpProvider.interceptors數(shù)組定義的一組攔截器,每個攔截器都是實現(xiàn)了某些特定方法的Factory。本文就介紹了為Angular.js內置$http服務添加攔截器的方法。2016-12-12AngularJS使用ng-options指令實現(xiàn)下拉框
這篇文章主要介紹了AngularJS使用ng-options指令實現(xiàn)下拉框效果,ng-option指令使用也很簡單,下文具體給大家說明,對angularjs 下拉框知識感興趣的朋友一起看下吧2016-08-08