различное поведение ChangeDetectionStrategy.OnPush со встроенными дочерними и нг-контентами - PullRequest
2 голосов
/ 08 марта 2019

Я настраиваю производительность приложения и натолкнулся на следующие отличия. Пожалуйста, посмотрите стек для живого примера.

Компоненты с суффиксом -on-push имеют ChangeDetectionStrategy.OnPush, тогда как компоненты с суффиксом -default имеют стратегию по умолчанию.

У меня есть два подхода, которые я назвал «внедренными» для первого и «ng-content» для второго. Разъяснение следует ниже.

корневой шаблон:

<h1>embedded</h1>
<app-embedded-on-push></app-embedded-on-push>

<h1>ng-content</h1>
<app-ng-content-on-push>
  <app-ng-content-default></app-ng-content-default>
</app-ng-content-on-push>

Где app-embedded-on-push шаблон просто "встраивает" компонент app-embedded-default:

<app-embedded-default></app-embedded-default>

С другой стороны, шаблон app-ng-content-on-push s проецирует компонент app-ng-content-default с ng-content:

<ng-content></ng-content>

Пожалуйста, ознакомьтесь со стекабликом, чтобы получить лучшую идею.

ожидание

Поскольку компоненты с ChangeDetectionStrategy.OnPush проверяются (сам компонент и его дочерние элементы) только в случае изменения входных ссылок, я ожидаю, что на самом компоненте и его дочерних элементах обнаружение изменений не будет запускаться с обоими подходами, названными встроенным и подходом контент-проекции.

реальность

При встроенном подходе поведение такое, как и ожидалось, обнаружение изменений на app-embedded-default не будет срабатывать. С другой стороны, при проекции содержимого (ng-content) обнаружение изменений дочернего компонента app-ng-content-on-push запускается , как вы можете видеть на приведенном выше стеке.

Может кто-нибудь объяснить, почему так поступают? Дерево компонентов одинаково на обоих подходах, или я ошибаюсь?

1 Ответ

2 голосов
/ 08 марта 2019

Реальность верна, потому что если мы посмотрим на шаблон:

<app-ng-content-on-push>
  <app-ng-content-default></app-ng-content-default>
</app-ng-content-on-push>

, мы не можем сказать, что app-ng-content-default является дочерним компонентом app-ng-content-on-push, а скорее этот компонент проецируется вapp-ng-content-on-push.

Это означает, что этот компонент является частью шаблона AppComponent и будет проверяться при проверке шаблона AppComponent.app-ng-content-on-push не защитит app-ng-content-default от проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...