Angular обнаружения изменений работает с помощью библиотеки zone. js. Обновление запросов ViewChild / Content происходит во время цикла обнаружения изменений .
Зона. js библиотека исправляет асинхронные c API (addEventListener, setTimeout (), Promises ...) и знает какая именно задача выполняется и когда она завершена.
Например, он может прослушивать событие щелчка и выдавать уведомление, когда эта задача была завершена (нет ожидающих задач, то есть эта зона становится стабильным).
Angular подписывается на эти уведомления, чтобы выполнить обнаружение изменений во всех трех компонентах, начиная с root компонента.
// your code
(click)="someHandler()"
someHandler() {
....
}
// angular core
checkStable() {
if (there is no any task being executed and there is no any async pending request) {
PERFORM CHANGE DETECTION
}
}
Порядок в коде примерно следующий:
click
||
\/
someHandler()
||
\/
checkStable()
||
\/
PERFORM CHANGE DETECTION
Итак, давайте ответим на ваши вопросы:
- Почему значение второй строки this.falseViewChild отображается как неопределенное . Не должно ли обнаружение изменений запускаться после установки this.display = false, и, следовательно, оно не должно быть неопределенным?
При изменении display
свойства
* 1029 реактивность отсутствует. *
Вот почему вы получаете следующий результат при первом щелчке:
> undefined undefined
> undefined undefined <---- nothing has updated
......
update happens here
Он будет обновлен позже, но вы не увидите его, если не нажмете еще раз, потому что вы не регистрируете их значения позже.
Why does this.trueViewChild stay undefined. I would expect it to find the element after the *ngIf becomes true?
Потому что для этого есть правило из Angular документации :
С запросами stati c ( stati c: true), запрос разрешается после создания представления, но до запуска обнаружения изменений. Результат, однако, никогда не будет обновлен , чтобы отразить изменения в вашем представлении, такие как изменения в блоках ngIf и ngFor.
Это означает, что если это изначально false
(например, внутри * ngIf или ng-template
), тогда всегда будет false