Habr<p>От магии до понятной структуры: разбираемся, как работает Change Detection в Angular</p><p>В Angular любое изменение в компоненте, которое отображается на экране, является результатом работы механизма отслеживания изменений (Change Detection, CD). За этим процессом стоит Zone.js, который можно представить в роли дирижера, сообщающего компонентам о необходимости обновить DOM. Zone.js не запускает CD сам. Он лишь создает контекст, в котором Angular потом может его запустить. Его задача только уведомлять Angular о завершении асинхронных операций, после чего Angular решает, нужно ли проверять изменения. Чтобы понять важность такого подхода, нужно учитывать особенности JavaScript. В JavaScript асинхронные операции, такие как setTimeout или fetch, разрывают стек вызовов. Это значит, что callback-функция, выполняемая после завершения асинхронной операции, не имеет информации о контексте, в котором она была вызвана. Для фреймворка, который отслеживает изменения, это создает определенные трудности: как узнать, что асинхронная операция завершилась и, возможно, изменила данные? Заглянуть под капот</p><p><a href="https://habr.com/ru/articles/925260/" rel="nofollow noopener" translate="no" target="_blank"><span class="invisible">https://</span><span class="">habr.com/ru/articles/925260/</span><span class="invisible"></span></a></p><p><a href="https://zhub.link/tags/Angular" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Angular</span></a> <a href="https://zhub.link/tags/Change_Detection" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Change_Detection</span></a> <a href="https://zhub.link/tags/Zonejs" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Zonejs</span></a> <a href="https://zhub.link/tags/Zoneless" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Zoneless</span></a> <a href="https://zhub.link/tags/Angular_Signals" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Angular_Signals</span></a> <a href="https://zhub.link/tags/%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Производительность</span></a> <a href="https://zhub.link/tags/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Оптимизация</span></a> <a href="https://zhub.link/tags/RxJS" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>RxJS</span></a> <a href="https://zhub.link/tags/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>Архитектура</span></a> <a href="https://zhub.link/tags/javascript" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>javascript</span></a></p>