У меня проблема с обнаружением изменений onPush в приложении Angular.
Я создал демонстрационное приложение, которое иллюстрирует проблему: https://stackblitz.com/edit/angular-vcebqu
Приложение содержит parent
компонент и child
компонент.
И parent
, и child
используют обнаружение изменений onPush.
И parent
, и child
имеют входы, разбитые на геттеры и сеттеры, причем this.cd.markForCheck();
используется в установщиках.
private _element: any;
@Output()
elementChange = new EventEmitter<any>();
@Input()
get element() {
return this._element;
}
set element(newVal: any) {
if (this._element === newVal) { return; }
this._element = newVal;
this.cd.markForCheck();
this.elementChange.emit(this._element);
}
Компонент parent
создает несколько компонентов child
, используя цикл *ngFor
, например:
<app-child
*ngFor="let element of item.elements; let index = index; trackBy: trackElementBy"
[element]="item.elements[index]"
(elementChange)="item.elements[index]=$event"></app-child>
Проблема в том, что если данные обновляются в компоненте parent
, изменения не распространяются на компонент (ы) child
.
В демонстрационном приложении нажмите кнопку «изменить» и обратите внимание, что первый «элемент» в массиве «elements» (elements[0].order
) обновляется в родительском элементе, но изменение не отображается в «элементе» первого child
компонента. Однако, если обнаружение изменений OnPush удалено из компонента child
, оно работает правильно.