Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 3

Отлично! Все разложено по полочкам.

Однако, есть вопрос зачем в примерах используется this.cdr.detectChanges() если в тексте указано, что данных механизм синхронный и markForCheck предпочтительнее? Как все-таки более правильно? Часто вижу, что в разных примерах используют detectChanges. Как по мне, так в 99% случаев нужен только markForCheck.

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

Отличный вопрос, спасибо, что обратили на это внимание.

Вы абсолютно правы в 99% случаев markForCheck является предпочтительным и более правильным выбором. Мое решение использовать detectChanges в этом конкретном примере было осознанным и использовалось скорее как упрощенный пример.

Хотелось максимально наглядно и синхронно показать прямую связь: вот мы изменили данные -> вот мы вызвали метод -> вот DOM немедленно обновился. Это самый простой способ продемонстрировать сам факт ручного управления в Zoneless мире, не усложняя первый пример объяснением про следующий тик и асинхронную природу markForCheck.

Так что да, полностью согласен с вами, markForCheck это основной инструмент для OnPush компонентов, а detectChanges это скорее для особых случаев, вроде полностью отсоединенных от дерева CD компонентов или для синхронных проверок в unit тестах.

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации