3.3 В чем отличие markForCheck() и detectChanges()?
Vložit
- čas přidán 18. 12. 2020
- Если вы не выключили модуль NgZone, то он будет с большой частотой вызывать механизм ChangeDetection и установить отличие между markForCheck() и detectChanges() будет довольно сложно. Метод markForCheck() сделан для работы в режиме OnPush, чтобы дать понять детектору, что мы хотим запустить синхронизацию изменений, даже не смотря на то что входные данные не изменились. В свою очередь detectChanges() создан больше чтобы работать в комбинации с методом detach(), когда вы хотите запустить ChangeDetection в локальной ветке.
Официальная документация:
angular.io/api/core/ChangeDet...
Код: github.com/stevermeister/Angu...
Дальнейшие планы по Angular Pro - github.com/stevermeister/Angu...
Если у вас есть вопросы или предложения, пожалуйста пишите в комментарии либо пингуйте в твиттере - / stevermeister
Самое четкое объяснение из всех, что видел.
Большое спасибо, простое и наглядное объяснение.
Спасибо большое! Коротко и понятно)
Thank, nice example
Супер, спасибо, но у меня есть такой вопрос где вернее в каких компонентак нужно использывать chengeDetection?, в компанентах где есть инпут оутпут?
changeDetection используется во всех компонентах.
просто стратегия может быть Default (всегда обновляем) либо OnPush (обновляем, если изменился input/ или вручную).
Default - как мы уже поняли из названия - стоит по умолчанию.
OnPush - выставляется покомпонентно - с целью оптимизации приложения (чтобы реже запускать механизм changeDetection на всем дереве компонентов)
@@stevermeister Большое человеческое спасибо).
Спасибо большое за наглядный пример! Есть только один вопрос. Разве метод cdCheck() вызывается не при рендере? Как я понимаю, ngDoCheck вызывается когда ангуляр производит change detection у компонента, но не факт, что компонент будет заново отрендерен (если после проверки изменений ничего не найдено, то и ре-рендерить не нужно). Т.е. рендер и проверка изменений это разные вещи
безусловно, рендеринг и проверка - это разные вещи.
но запускается ли рендеринг или нет - вы можете легко проверить сами: выключите зоны, запустите CD по таймеру, и в дочернем компоненте сделайте переменную, которая будет выводиться и обновляться по таймеру - если не будет редеринга - изменение переменной вы не увидите
Я сделал подобное приложение но только указал компонентам что у них у всех стратегия OnPush. При таком раскладе markForCheck работает не совсем так как вы описали. Да он идет наверх лишь для того чтобы построить путь к помеченному компоненту. При этом он не проверяет изменения на родителях, так как они onPush. Но доходит до помеченного и проверяет только его. И не проверяет его дочерние элементы.
Сам себя поправлю. Я понял почму мой пример не проверял изменения на родителях. Я формировал дерево компонентов с использованием ng-content. А markForCheck отмечает как dirty (то есть для проверки изменений в следующий тик) всех своих родителей именно через механизм шаблонов. То есть если непосредственно в шаблоне был использован компонент, то родительским будет считать компонент использующий именно этот шаблон. Или если мы проецируем какой-то контент в компонент то этот контент будет дочерним к тому компоненту где мы и проецируем этот контент. Очень запутанно но как смог поправил себя.
Спасибо, но я чет с первого раза не понял. Запустил английскую версию, там прям понятно объяснено. Спасибо что записал и русскую и английскую версию :)
Это ссылка на английскую версию с этого же канала.
czcams.com/video/OcphK_aEd7I/video.html
видишь как полезно знать оба языка :)
действительно бывает такое, что в какой-то из версий что-то получается высказать более четко
Спасибо за русскую версию. Я английский на слух не воспринимаю