3.3 В чем отличие markForCheck() и detectChanges()?

Sdílet
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

Komentáře • 15

  • @vadimr5847
    @vadimr5847 Před 7 měsíci

    Самое четкое объяснение из всех, что видел.

  • @user-ez7hs2cz9u
    @user-ez7hs2cz9u Před rokem

    Большое спасибо, простое и наглядное объяснение.

  • @psy-care
    @psy-care Před 2 lety +1

    Спасибо большое! Коротко и понятно)

  • @vadymhres8295
    @vadymhres8295 Před 2 lety

    Thank, nice example

  • @SergioUkrAr
    @SergioUkrAr Před 2 lety +1

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

    • @stevermeister
      @stevermeister  Před 2 lety +3

      changeDetection используется во всех компонентах.
      просто стратегия может быть Default (всегда обновляем) либо OnPush (обновляем, если изменился input/ или вручную).
      Default - как мы уже поняли из названия - стоит по умолчанию.
      OnPush - выставляется покомпонентно - с целью оптимизации приложения (чтобы реже запускать механизм changeDetection на всем дереве компонентов)

    • @SergioUkrAr
      @SergioUkrAr Před 2 lety

      @@stevermeister Большое человеческое спасибо).

  • @ddobr
    @ddobr Před rokem

    Спасибо большое за наглядный пример! Есть только один вопрос. Разве метод cdCheck() вызывается не при рендере? Как я понимаю, ngDoCheck вызывается когда ангуляр производит change detection у компонента, но не факт, что компонент будет заново отрендерен (если после проверки изменений ничего не найдено, то и ре-рендерить не нужно). Т.е. рендер и проверка изменений это разные вещи

    • @stevermeister
      @stevermeister  Před rokem +1

      безусловно, рендеринг и проверка - это разные вещи.
      но запускается ли рендеринг или нет - вы можете легко проверить сами: выключите зоны, запустите CD по таймеру, и в дочернем компоненте сделайте переменную, которая будет выводиться и обновляться по таймеру - если не будет редеринга - изменение переменной вы не увидите

  • @TemRhythm
    @TemRhythm Před rokem

    Я сделал подобное приложение но только указал компонентам что у них у всех стратегия OnPush. При таком раскладе markForCheck работает не совсем так как вы описали. Да он идет наверх лишь для того чтобы построить путь к помеченному компоненту. При этом он не проверяет изменения на родителях, так как они onPush. Но доходит до помеченного и проверяет только его. И не проверяет его дочерние элементы.

    • @TemRhythm
      @TemRhythm Před rokem +1

      Сам себя поправлю. Я понял почму мой пример не проверял изменения на родителях. Я формировал дерево компонентов с использованием ng-content. А markForCheck отмечает как dirty (то есть для проверки изменений в следующий тик) всех своих родителей именно через механизм шаблонов. То есть если непосредственно в шаблоне был использован компонент, то родительским будет считать компонент использующий именно этот шаблон. Или если мы проецируем какой-то контент в компонент то этот контент будет дочерним к тому компоненту где мы и проецируем этот контент. Очень запутанно но как смог поправил себя.

  • @maxsokol3613
    @maxsokol3613 Před 2 lety +1

    Спасибо, но я чет с первого раза не понял. Запустил английскую версию, там прям понятно объяснено. Спасибо что записал и русскую и английскую версию :)
    Это ссылка на английскую версию с этого же канала.
    czcams.com/video/OcphK_aEd7I/video.html

    • @stevermeister
      @stevermeister  Před 2 lety +3

      видишь как полезно знать оба языка :)
      действительно бывает такое, что в какой-то из версий что-то получается высказать более четко

  • @user-yj7yv7mq1s
    @user-yj7yv7mq1s Před 2 lety

    Спасибо за русскую версию. Я английский на слух не воспринимаю