Согласно docs ChangeDetectionStrategy.OnPush
"применяется ко всем дочерним директивам и не может быть переопределено". Как я понимаю, установки OnPush
обнаружения изменений для родительского компонента достаточно, чтобы пропустить обновления представления дочерних компонентов, пока их значения привязки @Input
не изменятся.
Ниже приведен пример стекаблица со следующей структурой компонента:
app-component -> cmp1 -> cmp2 -> cmp3
Каждый из компонентов cmp * отображает некоторое значение, оцененное геттером display
. Кнопки рендеринга App, cmp1 и cmp2 изменяют значения ввода дочерних компонентов.
https://stackblitz.com/edit/angular-change-detection-with-getters
Когда я устанавливаю changeDetection: ChangeDetectionStrategy.OnPush
только в AppComponent
декораторе, все три геттера display
оцениваются при каждом нажатии кнопки, даже если соответствующие входы компонента остаются неизменными (откройте консоль devtools, чтобы просмотреть журналы).
Желаемое поведение достигается только установкой ChangeDetectionStrategy.OnPush
для каждого компонента (попробуйте раскомментировать). Это
изменение входных сигналов cmp1 только для получателя cmp1
изменение входных триггеров cmp2 геттеры cmp1 и cmp2
изменение входных триггеров cmp3 cmp1, cmp2 и cmp3 getter
Почему я должен устанавливать обнаружение изменений OnPush для каждого компонента, чтобы дочерние компоненты не могли переоценивать получатели? Это правильно?