Я запускаю cdr.detectChanges() в некотором вложенном дочернем элементе (Child1), у которого есть родитель, а также другой вложенный дочерний компонент (Child2).
Почему, если я запущу метод trigger detectChanges в компоненте Child1, а в компоненте Child2 будет вызываться только ngDoCheck? Разве он не должен вызывать DoCheck в текущем компоненте (Child1) и DoCheck в Child2? Как я могу узнать, что текущий компонент также проверен?
Я подготовил небольшой пример: https://github.com/michalgrzegorczyk-dev/change-detection
компоненты: (app-child1, app-child2)
В этой статье объясняется, почему так происходит:
Когда обнаружение изменений запускается для определенного представления/компонента, выполняет следующие операции в указанном порядке:
... 6. вызывает OnInit и ngDoCheck для дочернего компонента (OnInit вызывается только при первой проверке)
Итак, в вашем случае, когда вы запускаете child1.detectChanges()
Angular, будет запускаться ngDoCheck
привязка к дочернему компоненту, то есть child2
. Одна из причин, по которой он разработан таким образом, заключается в том, чтобы разрешить ручное управление логикой OnPush
с помощью хука ngDoCheck
. Если child2
определен как onPush и привязки ввода не изменились, вы все равно можете вызвать changeDetectorRef.markForCheck()
из ngDoCheck
из child2
, чтобы пометить компонент как грязный. Таким образом, ngDoCheck
сигнализирует о том, что Angular собирается запустить проверку дочернего компонента, где часть проверки включает в себя обновление входных реквизитов дочерних компонентов и обновление привязок представления к текущему компоненту.