[Angular] ChangeDetector 之 markForCheck 篇
Angular 的 Change Detection 機制,問題: 在使用 onPush 策略時,一定都要重新傳新物件才能出發更新嗎? 答案:不用
ChangeDetecotrRef 提供了一些方法,允許我們手動觸發檢查更新機制,而 markForCheck 是其中一個
markForCheck
markForCheck 的用途,當呼叫這個方法時,就是告訴 ChangeDetector ,請檢查我本身及我上頭的 Component。更新的方向性是往 Root 向上移動
markForCheck的程式碼
1 | let currView: ViewData|null = view; |
以下提供幾個可能使用情境
使用情境
setTimeout、setInterval
可以從我之前寫的文章溫習一下什麼是 ChangeDetectionStrategy.OnPush
當 Component 的 changeDetection 設定為 ChangeDetectionStrategy.OnPush,如果有使用 setTimeout 時,就必須配合 markForCheck() 的方法來更新 View 的顯示。
1 | import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit} from '@angular/core'; |
這裡有簡單的程式碼 可以實際執行看看,取消註解後看看執行的結果。
Input as DataStream
當 @Input 的資料型態為 Observable 再加上 onPush 時,也會有 setTimeout、setInterval 的情況出現,所以這時候也必須依賴 markForCheck 來執行顯示更新
1 | import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit} from '@angular/core'; |
這裡有簡單的程式碼 可實際執行看看,取消註解後看看執行的結果。