Angular2裡面偵測改變的方法有全新的方式,用來提升整體的效能,那針對Component對於偵測改變有一個屬性可以設定,那就是透過 ChangeDetectionStrategy
根據官方文件, ChangeDetectionStrategy有幾種方式
- CheckOnce
- Checked
- CheckAlways
- Detached
- OnPush
- Default
這篇只專注於Default與OnPush這兩種
Change Detection Strategy
Default
Example Code
1 | <movie [title]="title" [actor]="actor"></movie> |
1 | title: string = "Movie 1"; |
針對movie這個component, 它接收兩種值,一個是string型別的title, 另外一個是Actor型別的物件。
Movie Component會在什麼時機點更新要顯示的內容呢? 如果 ChangeDetectionStrategy是設定在Default的時候,那就是只要傳入的值有異動時,就更新顯示的內容。換句話說, 即使修改actor物件裡面的property, 也會觸發。
onPush
可是換到onPush的時候就有點不一樣了,他不會將修改actor屬性視為值的異動,只會當一個全新的Actor物件被建立時,才會觸發更新。
這樣的好處是,減少detect Dirty Change的次數. 就預設的方式,如果我的Actor物件裡面有很多屬性,那當每一次其中一個屬性的值被異動時,都會觸發畫面的更新,那就太累了。而onPush是會等一個全新物件被建立時,才會出發。所以只要用要更新的值去建立一個新的物件就好了,這樣子只會被觸發一次。當然效能就會大大的提升
Immutable
Immuatable是另外一個議題。他的主要精神是。每一次的動作,都會產生一個新的物件,並不會直接修改原始物件內的值,或是使用參址的方式處理資料. 更詳細的內容可以參閱RxJS和Immutable