Комментарии 3
Отлично! Все разложено по полочкам.
Однако, есть вопрос зачем в примерах используется this.cdr.detectChanges()
если в тексте указано, что данных механизм синхронный и markForCheck
предпочтительнее? Как все-таки более правильно? Часто вижу, что в разных примерах используют detectChanges. Как по мне, так в 99% случаев нужен только markForCheck.
markForCheck только помечает компоненты как "грязные", а дальше работает уже стандартный цикл изменений ангуляра. detectChanges запускает цикл изменений вручную + он это делает для компонента и его потомков в дереве. Отсюда может быть просадка производительности. Вроде даже в доке было, что detectChanges нужно использовать для компонентов, которые отцепили от основного механизама обнаружения изменений.
Отличный вопрос, спасибо, что обратили на это внимание.
Вы абсолютно правы в 99% случаев markForCheck является предпочтительным и более правильным выбором. Мое решение использовать detectChanges в этом конкретном примере было осознанным и использовалось скорее как упрощенный пример.
Хотелось максимально наглядно и синхронно показать прямую связь: вот мы изменили данные -> вот мы вызвали метод -> вот DOM немедленно обновился. Это самый простой способ продемонстрировать сам факт ручного управления в Zoneless мире, не усложняя первый пример объяснением про следующий тик и асинхронную природу markForCheck.
Так что да, полностью согласен с вами, markForCheck это основной инструмент для OnPush компонентов, а detectChanges это скорее для особых случаев, вроде полностью отсоединенных от дерева CD компонентов или для синхронных проверок в unit тестах.
От магии до понятной структуры: разбираемся, как работает Change Detection в Angular