Угловой 4: разница между ngDoCheck и ngAfterViewChecked
В Angular 2+ ngDoCheck и ngAfterViewChecked, кажется, выполняют одну и ту же функцию. ngDoCheck
называется вызванным всякий раз, когда обнаруживается изменение. Теперь это обнаружение изменений будет вызвано изменением в представлении. Согласно документам, ngAfterViewChecked
вызывается всякий раз, когда вид меняется.
Зачем здесь нужны два крючка жизненного цикла, когда одного было достаточно?
4 ответа
Существует огромная разница:
ngDoCheck вызывается очень часто при каждом запуске обнаружения изменений, и вам следует избегать его использования во избежание проблем с производительностью. Он обнаружит изменения в любом элементе, содержимом или поведении изменения представления.
ngAfterViewChecked вызывается только после проверки привязок дочерних элементов представления (это относится только к представлению).
DoCheck
Hook позволяет интегрироваться в цикл обнаружения изменений и находить изменения в ссылках на объекты или в любых областях, где Angular не обнаруживает изменения автоматически. Интерфейс выглядит следующим образом:
interface DoCheck {
ngDoCheck(): void;
}
в зависимости от размера и сложности дерева компонентов, ngDoCheck
Метод будет выполняться огромное количество раз и может стать узким местом производительности, если вы плохо реализуете код. Избегать использования ngDoCheck
метод без необходимости.
При использовании свойств типа объекта Angular будет наблюдать за изменениями по ссылке на значение, то есть обнаруживает изменение всего значения, но не изменений дочерних свойств. Это тот случай, когда мы собираемся использовать DoCheck
перехватить жизненный цикл и обнаружить изменения в объекте.
ngAfterViewChecked
метод представляет AfterViewChecked
Хук жизненного цикла и интерфейс. Это позволяет вам настраивать отслеживание изменений, которое не обрабатывается Angular по какой-либо причине. Поведение аналогично ловушке AfterContentChecked, но применяется к дочерним шаблонам представления, а не к проецируемому содержимому.
interface AfterViewChecked {
ngAfterViewChecked(): void;
}
В первую очередь DoCheck предназначен для изменений вашей бизнес-логики, которые не будут обнаруживаться угловыми в сценариях, как указано выше. AfterViewChecked
для отслеживания просмотра.
Надеюсь, это поможет!!!
Они оба являются угловыми крюками жизненного цикла. И это интерфейсы из базовой библиотеки Angular, которые можно подключить к вашему коду для прослушивания изменений свойств компонента.
Вот полная последовательность циклов
1) ngOnChanges ()
2) ngOnInit ()
3) ngDoCheck ()
4) ngAfterContentInit ()
5) ngAfterContentChecked ()
6) ngAfterViewInit ()
7) ngAfterViewChecked ()
Из официальной документации
ngDoCheck
Обнаруживать и реагировать на изменения, которые Angular не может или не сможет обнаружить самостоятельно.
Вызывается во время каждого запуска обнаружения изменений, сразу после ngOnChanges () и ngOnInit ().
ngAfterViewChecked ()
Отвечать после Angular проверяет представления компонента и дочерние представления / представление, в котором находится директива.
Вызывается после ngAfterViewInit и каждого последующего ngAfterContentChecked ().
Для получения дополнительной информации: https://blog.angularindepth.com/if-you-think-ngdocheck-means-your-component-is-being-checked-read-this-article-36ce63a3f3e5
Следует отметить одно важное отличие:
ngDoCheck
ловушка жизненного цикла срабатывает до того, как свойство изменится в текущем компоненте и его дочерние компоненты вступят в силу, тогда как
ngAfterViewChecked
срабатывает после того, как эти изменения произошли, поэтому вы сравниваете предыдущие и текущие значения свойств компонента.