angular2+監測屬性的變化

weixin_33907511發表於2017-07-31

angular專案中通過@Input來實現從父component到子component屬性的傳值。angular框架本身提供了一系列的鉤子函式, 其中ngOnchange是對傳入值進行監測,只要傳入值有所變化,就會進入ngOnchange鉤子函式。

曾經一度也是認為,屬性的監測理所當然應該是在ngChange裡操作。但自從遠方的朋友給了這樣一個comments:

6095934-1c659e286c6e6874.png

查閱了相關資料,setter相較於ngOnchange的好處,大致可以理解為,ngOnChange執行的時候,會監測所有@Input屬性的變化,但有的時候我們往往只需要對某一個屬性進行監測,所以用setter更簡潔方便, 詳情:https://ngdev.space/angular-2-input-property-changes-detection-3ccbf7e366d2

但令我好奇的是,angular關於@Input的實現原理到底是什麼,為什麼只要輸入引數有所變化就會,進入setter這個鉤子函式呢?

查閱了angular關於@Input的原始碼庫,其實現邏輯為:

6095934-badcb3b7c4a86d3e.png

@Input 傳入即是從父元件的dom元素取值賦值給子元件變數的一個過程。即是賦值操作,自然會進入setter函式,也就是說只要父元件dom元素的值發生變化,即會發生一次賦值操作進入setter鉤子函式。

問題又來了, 父元件是怎麼監測到dom元素值發生變化的呢?

這就涉及到一個永恆的話題,變化監測,Angular的變化檢測可以分元件進行,每個元件都有對應的變化檢測器ChangeDetector。這裡先不深入探究。關於angular變化監測這個深坑,一定要細細品味,深入骨髓。。。

https://zhuanlan.zhihu.com/p/27901766 (先貼一個連結,回頭慢慢看)

https://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html

相關文章