Я до сих пор не понимаю, в чем разница между cdr.detectChanges()
и cdr.markForCheck()
для OnPush
стратегии обнаружения изменений из представления об использовании.
Даже если я прочитал это ТАК вопрос и InDepth объяснение.
Почему я не могу просто позвонить cdr.detectChanges()
? Зачем мне нужно отмечать дерево от текущего компонента до root (или это связано с переносом на следующий цикл обнаружения)?
Или это как-то требуется обновить родительские компоненты?
В следующем примере оба способа работают:
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
@Component({
selector: 'app-test',
template: `{{ i }}`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TestComponent implements OnInit {
private i = 0;
constructor(private cdr: ChangeDetectorRef) { }
ngOnInit() {
setInterval(() => {
this.i++;
// this.cdr.detectChanges(); // this works too and updates view
this.cdr.markForCheck(); // but this is for some reason recommended
}, 1000);
}
}