Angular обнаружение изменений проверяет родительский компонент на событие в дочернем компоненте - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю над проектом Angular 8 и столкнулся с проблемой производительности в changeDetection. Для событий в дочерних компонентах Angular запускает обнаружение изменений для родительского компонента, которые вызывают проблемы с производительностью.

Здесь минимальное воспроизведение моей проблемы. У меня есть контейнер с элементами.

<p> elements: </p>
<div *ngFor="let el of element_list(); trackBy: trackByConstant">
  <app-element [text]="el"></app-element>
</div>
<div>{{element_list() | json}} </div>
<app-element [text]="'lorem ipsium'"></app-element>

В app-element Я связываю события mouseenter и mouseleave для выделения элементов (в реальном проекте есть более сложные логи c).

В обоих компонентах установлена ​​стратегия changeDetection OnPush

Когда события запускаются в app-element (в * ngFor и вне его) Angular дважды вызывает element_list. Это означает, что Angular запускает обнаружение изменений для родительского компонента.

Почему Angular запускает обнаружение изменений для родительского компонента? Я обнаружил, что я могу это исправить с помощью addEventListener. Но это довольно неудобный способ. Есть ли способ остановить такое поведение Angular?

Есть рабочий пример: https://stackblitz.com/edit/angular-cog2f5

...