Я использую BehaviorSubject
, который действует как состояние для дочернего компонента
state = new BehaviorSubject<any>({transform: 'translate3d(0, 0, 0)'});
styleState = this.state.asObservable();
В шаблоне дочернего компонента я подписываюсь на состояние, используя async
pipe
<div>{{ styleState | async | json }}</div>
Затем я обновляю состояние дочернего компонента с помощью события прокрутки
ngOnInit() {
this.zone.runOutsideAngular(() => {
fromEvent(this.el.nativeElement, 'scroll').pipe(
tap((e: any) => {
this.zone.run(() => {
this.state.next({ scrollTop: e.target.scrollTop });
});
})
).subscribe();
});
}
Теперь в родительском компоненте обнаружение изменений запускается событием прокрутки дочернего компонента
ngAfterViewChecked() {
console.log('Parent View Checked!');
}
Проблема в том, что логика зависит от события прокрутки, и я не хочу, чтобы он вызывал обнаружение изменений в родительском компоненте. зная, что я использую OnPush
стратегию обнаружения изменений как в родительском, так и в дочернем компоненте
Это нормально? как я могу избежать этого?
Вот минимальное воспроизведение https://stackblitz.com/edit/angular-hkwvy4?file=src%2Fapp%2Fhello.component.ts