我一直在進行一個關於在Angular組件中處理狀態的小實驗。Debounce Angular ngDoCheck生命週期鉤子
比方說,我有一個變量的成本高昂,取決於其他幾個。我可以寫一個函數updateVar()
,並在我知道可能會影響它的每個事件上調用它,例如。通過訂閱。但是當上述功能在超過5個不同的地方被調用時,它不會感覺非常乾燥或不健壯。
因此,如何去掉DoCheck
Angular生命週期鉤子?
docheckSubject: Subject<any> = new Subject();
debounced: boolean = false;
constructor(private cd: ChangeDetectorRef) {}
ngOnInit() {
this.docheckSubject.debounceTime(50).subscribe(
() => this.ngDoCheckDebounced()
);
}
ngDoCheck() {
if (!this.debounced) {
this.docheckSubject.next();
} else {
this.debounced = false;
}
}
ngDoCheckDebounced() {
this.debounced = true;
this.updateVar();
this.cd.detectChanges(); // needed to reflect update in DOM
}
這種方法似乎在我的真實應用程序中正常工作,當然,更多的ngDoCheck()正在發生,而量角器測試也不會抱怨。但我無法擺脫做一個骯髒的不那麼聰明的黑客的感覺。
問題:這會咬我嗎?事實上,我是否需要它?
'每個部件進行檢查時ngDoCheck'叫,什麼是去抖動它的意義呢?也許弄清楚爲什麼這麼頻繁地進行支票? –
它經常被調用,因爲組件具有包含表單的不同數量的子組件(假設平均值爲20)。在用戶選擇時,所有的子組件形式可能會被修補爲新的值。據我所知,這可能會導致~50 ngDoCheck()連續調用。 –
順便說一句我讀過你的其他帖子,例如。 https://stackoverflow.com/questions/42643389;) –