3 回答

TA貢獻1712條經(jīng)驗 獲得超3個贊
兩者之間的最大區(qū)別是detectChanges()實際上觸發(fā)變更檢測,而markForCheck()不會觸發(fā)變更檢測。
detectChanges
該代碼用于從觸發(fā)您的組件開始對組件樹進行更改檢測detectChanges()。因此,更改檢測將針對當前組件及其所有子組件運行。Angular在中保留對根組件樹的引用ApplicationRef,當發(fā)生任何異步操作時,它會通過包裝方法觸發(fā)對該根組件的更改檢測tick():
@Injectable()
export class ApplicationRef_ extends ApplicationRef {
...
tick(): void {
if (this._runningTick) {
throw new Error('ApplicationRef.tick is called recursively');
}
const scope = ApplicationRef_._tickScope();
try {
this._runningTick = true;
this._views.forEach((view) => view.detectChanges()); <------------------
view這是根組件視圖。正如我在引導(dǎo)多個組件的含義中所描述的那樣,可能有許多根組件。
@milad描述了您可能需要手動觸發(fā)更改檢測的原因。
markForCheck
就像我說的,這個家伙根本不會觸發(fā)變更檢測。它只是從當前組件向上擴展到根組件,并將其視圖狀態(tài)更新為ChecksEnabled。這是源代碼:
export function markParentViewsForCheck(view: ViewData) {
let currView: ViewData|null = view;
while (currView) {
if (currView.def.flags & ViewFlags.OnPush) {
currView.state |= ViewState.ChecksEnabled; <-----------------
}
currView = currView.viewContainerParent || currView.parent;
}
}
組件的實際更改檢測未計劃,但將來會發(fā)生時(作為當前或下一個CD周期的一部分),即使父組件視圖已脫離更改檢測器,也將對其進行檢查??梢酝ㄟ^使用cd.detach()或指定OnPush更改檢測策略來分離更改檢測器。所有本機事件處理程序都將所有父組件視圖標記為要檢查。
這種方法通常在ngDoCheck生命周期掛鉤中使用。如果您認為這ngDoCheck意味著正在檢查您的組件。

TA貢獻1890條經(jīng)驗 獲得超9個贊
商店更新主要是由于獲取或設(shè)置isFetching before導(dǎo)致的。并在獲取后..但是我們不能總是使用,async pipe
因為在訂閱內(nèi)部,我們通常有一些事情要做call setFromValues
do some comparison
..如果async
本身調(diào)用markForCheck
它,那么如果我們自己調(diào)用它會帶來什么問題呢?但是同樣,在ngOnInit
獲取不同數(shù)據(jù)時,我們通常會有2-3個或更多選擇器……而我們markForCheck
都將它們都調(diào)用了。
- 3 回答
- 0 關(guān)注
- 2900 瀏覽
添加回答
舉報