Каким образом markForCheck в Angular используется для обнаружения изменений?

Можно ли узнать, когда и какие действия выполняются после вызова markForCheck? Почему компоненты могут быть помечены как dirty после вызова этой функции при использовании стратегии onPush, но проверка изменений не инициируется?
  • 19 июля 2024 г. 13:52
Ответы на вопрос 2
Метод markForCheck в Angular используется для пометки компонента и его дочерних компонентов как "грязных" (dirty), чтобы показать Angular, что изменения произошли и нужно выполнить проверку изменений. 

Когда вы вызываете markForCheck, Angular не непосредственно запускает проверку изменений. Вместо этого, Angular помечает компонент и дочерние компоненты как "грязные" и планирует на следующем такте проверить их изменения. 

Однако, при использовании стратегии изменений OnPush, проверка изменений не инициируется сразу же после вызова markForCheck. Это происходит из-за того, что компоненты с этой стратегией изменений будут проверены только при наличии внешних изменений (событий извне, в том числе изменения во вводах компонентов). В этом случае, компоненты могут быть помечены как "грязные", но проверка изменений не будет инициирована до тех пор, пока не произойдут внешние изменения.

Таким образом, вызов markForCheck помогает Angular оптимизировать проверку изменений, делая ее более эффективной и эффективной.
в ангуляре используется костыль под названием zone.js. Оно манкипатчит возможные асинхронные взаимодействия, например проброс события или резолв промиса, точный список не помню. И при срабатывании триггерит проверку изменений всего проекта, начиная сверху. 

Если например выполнить какие-то асинхронные действия не затрагивая зону, например в обертке runOutsideAngular, то проверка не будет вызвана, даже если вы пометили компонент dirty.

Стратегия изменений определяет будут ли проверяться все компоненты вообще или только dirty.

Сейчас ангуляр движется в сторону собственных реактивных примитивов, т.н. signals, которые должны позволить уйти от проверки изменений вовсе и менять разметку точечно.
Похожие вопросы