ngOnChanges vs ngDoCheck. ChangeDetectionStrategy OnPush в Angular

Поделиться
HTML-код
  • Опубликовано: 18 дек 2024

Комментарии • 49

  • @МихаилКоломейцев-к8б
    @МихаилКоломейцев-к8б 8 месяцев назад +1

    Огромное спасибо, лучшее объяснение ChangeDetectionStrategy OnPush так еще и вместе с ngOnChanges и ngDoCheck , круто что при объяснении все моменты четко проговариваются.

  • @grommaks
    @grommaks  2 года назад +10

    Привет всем)
    В этом видео рассмотрим как оптимизировать обновление компонента, но при этом сделать его немного глупее...как вы поняли, немного разберемся в умных и глубых компонентах.
    Все это завязано на методах жизненного цикла ngOnChanges и ngDoCheck
    Приятного просмотра 👍

  • @aleksandrm3466
    @aleksandrm3466 2 года назад +7

    Спасибо. Очень хороший контент. Лаконично и практично. Было бы здорово, еще немного больше практических примеров как можно использовать doCheck, best practice...

  • @koni.21
    @koni.21 2 года назад +7

    Спасибо за урок! Такого качественного материала как у вас на русскоязычных контентах не встречал. Респект!

  • @denpulokas592
    @denpulokas592 2 года назад +6

    Спасибо большое за урок! Очень доходчиво объясняешь и подаёшь материал. На ютубе почти нет годного материала по Ангуляру, спасает твой канал!))

  • @ЕгорРура
    @ЕгорРура Год назад +1

    Спасибо большое за такой подробный урок! Узнал много нового.

  • @js3461
    @js3461 2 года назад +5

    Отлично подана информация, особенно для новичков. Я некоторые моменты, в том числе и обсуждаемый в этом ролике, осознал только через несколько месяцев работы на проекте. От себя хочу сказать, что в инпуты можно передавать observable и выводить в вёрстке через async pipe, в этом случае не нужно заботится о перерисовке при OnPush

    • @grommaks
      @grommaks  2 года назад

      Об этом я буду говорить в следующем плейлисте) но подход с передачей Observable мне не нравится, больше нравится распечатывать их в момент привязки

    • @G3tf
      @G3tf 2 года назад +1

      @@grommaks я использую behaviorsubject так же в свсязке с async pipe в шаблоне

    • @grommaks
      @grommaks  2 года назад +1

      @@G3tf если subject пришёл из сервиса то круто) в компоненте мне кажется это оверхед:)

    • @G3tf
      @G3tf 2 года назад +1

      @@grommaks и из сервиса бывает) и бывает из компонента родительского)

    • @grommaks
      @grommaks  2 года назад

      @@G3tf стараюсь обсервабл не передавать как параметр) но слышал что это как подход используется
      В компоненте использую если хочу на rxjs всю логику данных описать, тогда события перекидывают в Subject и в потоке обработка идёт, тоже подход со своими плюсами

  • @Kulibins1
    @Kulibins1 2 года назад +10

    Хороший материал 👍 Мне прям последние ролики нравятся, качество растёт от роликак к ролику.

  • @maratzinatulin2749
    @maratzinatulin2749 2 года назад +4

    Мощь, обычно в обучающих видео многие мелочи опускаются. Буду рад видеть ещё подобные видео.

  • @urchuk2006
    @urchuk2006 2 года назад +3

    Большое спасибо. Сейчас изучаю ангуляр и ваш канал мне очень помогает)

  • @mila4308
    @mila4308 2 года назад +1

    Спасибо большое за лекцию! Просто, доступно, интересно. Теперь все по полочкам в голове :)

  • @gagosimonyan1986
    @gagosimonyan1986 2 года назад +4

    Спасибо за старания )

  • @KolkhozDnepr
    @KolkhozDnepr 2 года назад +3

    Спасибо за труды)) вопросик - а у тебя нет случайно на Гите проектика с реализованными хуками, чтоб скачать развернуть подебажить, посмотреть вживую как что за чем работает? То вроде все понятно, а чувствую что начну писать и буду тупить)) то искал там что-то подобное, везде без хуков пишут...

    • @grommaks
      @grommaks  2 года назад +2

      Только проект этого курса (ссылка в описании) 😺так нужно больше часов пытаться и будет эффект) по другому не получается учиться

  • @dmytrokapustiuk9531
    @dmytrokapustiuk9531 4 месяца назад +1

    Привет Макс) Круто объясняешь, единственный момент когда мы вместо ngOnChanges используем set, дополнительно к set добавляется get, по идее get вызывается почти всегда, отсюда вопрос не влияет ли это на производительность? Если к примеру будет 10 гетеров)

    • @grommaks
      @grommaks  4 месяца назад

      @@dmytrokapustiuk9531 привет 👋
      Set и get я бы не рекомендовал использовать :)
      Get должен выполнять очень простую операцию, причем детерминированную (которая всегда вернет тот же результат если параметры не изменились) и тогда все будет нормально с производительностью.
      Как делать не нужно, в getter делать новый observable (через добавление динамически pipe к существующему observable), также не нужно копировать объекты в getter, иначе поменяется ссылка
      Какие паттерны есть для того чтобы не иметь геттер и сеттер ( или иметь их более надежном виде )
      1) ngOnChange для запуска перерасчета и сохранения в свойство компонента
      2) rxjs стрим, все можно конвертировать в стримы и описать логику расчета один раз в ngOnInit (тут бы я держал слой умного и простого компонента)
      3) новая фича - signals поможет сделать это красивее с точки зрения кода
      Ну и разумеется, тяжелые вычисления, если сильно хочется во время отрисовки их делать, то можно вынести в pipe, как минимум если это по SOLID и более одного компонента будут использовать это (гипотетически или практически)

  • @ОльгаЖурова-и5й
    @ОльгаЖурова-и5й 2 года назад +1

    Спасибо за материал. Но есть вопросик: onPush реагирует ТОЛЬКО на input? на Http request, addEventListener, setTimeout и тд реагирует стратегия default?

    • @grommaks
      @grommaks  2 года назад +2

      При OnPush сработает на Input и на привязки событий в шаблоне, такие как (click) и прочие, также сработает если повесили HostListener
      Насчет прямого element.addEventListener или асинхронных вызовов, то это будет работать при default, так как zone.js будет это отслеживать.

  • @Leonidn1972
    @Leonidn1972 6 месяцев назад

    Thanks a lot.Usefull content.

  • @danilbogatyrev8554
    @danilbogatyrev8554 2 года назад +1

    Спасибо, хороший урок!

  • @bukanaka
    @bukanaka 2 года назад +4

    "Атомные" уроки))

    • @grommaks
      @grommaks  2 года назад +2

      Атомный самурай из one punch man сразу вспомнился)

  • @yevhenpantiukhov3621
    @yevhenpantiukhov3621 2 года назад +1

    Для разбора темы повторил урок. Дерево Апп-Парент-Чаилд компоненты. В Апп сделал два метода, один мутирует массив, другой меняет ссылку (так же как в видео), не добавлял никаких changeDetection:ChangeDetectionStrategy.OnPush . Так вот при мутации данные на экране не меняются ! Наставил консолей в ngDoCheck , массив изменяется, видно в консоли, а отображение нет, в видео иначе. Я то вообще категорически против мутаций, но просто интересно, Ангуляр изменился от снятия видео ?

    • @grommaks
      @grommaks  2 года назад

      Видео свежее, все актуально) спасибо за отзыв

    • @yevhenpantiukhov3621
      @yevhenpantiukhov3621 2 года назад +2

      Уже разобрался, моя ошибка. Я решил сократить код и просто печатал на прямую массив (я понимаю что это несколько странно). Так вот, если ссылка та же самая то изменения массива в таком случае вообще никак не вывести. Вряд ли это кому пригодиться (кто ж на прямую тупо массив выводит на экран), но вот такой интересный момент.

  • @biovawan
    @biovawan 2 года назад +1

    Есть ли смысл переходить на родные js приватные поля с помощью '#'? Тем самым получили бы:
    #array: User[] = [];
    @Input set array(val: User[]) {
    this.#array = val;
    }
    get array(): User[] {
    this.#array;
    }

    • @grommaks
      @grommaks  2 года назад +1

      Спасибо за интересный вопрос
      Пока приходится поддерживать версии от 6 и выше, а также поддерживать IE в некоторых проектах, то я бы не стал переходить
      Явной рекомендации использовать такой подход нет, под капотом TS может сам это оптимизировать если это важно.
      Вывод, я бы не стал спешить, но знать о новинках нужно

    • @biovawan
      @biovawan 2 года назад +1

      @@grommaks благодарю за скорый ответ и за твои труды! Твой контент уникален, на могу взгляд) желаю успехов!

  • @raprap630
    @raprap630 3 месяца назад

    как быть с вариантом когда в input set приходит объект и в нем меняется какое-то из свойств (не весь объект целиком)?

    • @grommaks
      @grommaks  3 месяца назад

      @@raprap630 это грустная часть angular, что это легче сделать чем в других решениях
      Нужно придерживаться иммутабельного подхода, NGRX позволяет хранить данные с учетом иммутабельности
      Обычно все придерживаются такого подхода, с этим нет больших проблем, но рефакторить старый код сложно…

  • @ilnurryazhapov
    @ilnurryazhapov 2 года назад +2

    отличный контент

  • @iamantoon
    @iamantoon 7 месяцев назад

    Хочу спросить довольно общий вопрос про синхронизацию данных с сервером. Вот у меня есть Angular application, в нем нет роутинга, и в нем я делаю CRUD операции над данными. Они применяются, серверная часть срабатывает и меняется, но чтобы изменения увидеть визуально в клиенте, страницу нужно обновить. Как это исправить?

    • @grommaks
      @grommaks  7 месяцев назад

      Думаю запросы в сервисе делаются
      Тогда данные в сервисе надо хранит в BehaviorSubject чтобы компонент мог подписаться на изменения
      Если запрос в компоненте, то возможно стоит OnPush стратегия определения изменений, тогда нужен вызов changeDetectionRef.markForCheck()
      В момент обновления данных внутри компонента

    • @iamantoon
      @iamantoon 7 месяцев назад

      ​@@grommaks пока что не получается, в сервисе у меня такое:
      getLists(){
      return this.http.get(this.baseUrl);
      }
      В компоненте, который это отображает такое:
      ngOnInit(): void {
      this.listsService.getLists().subscribe({
      next: lists => {
      this.lists = lists.lists;
      this.listsNames = lists.listNames;
      }
      })
      }
      А в компоненте, который вносит изменение на сервер вот такое:
      editList(){
      this.listsService.editList(this.id, this.name).subscribe({
      next: () => this.toastr.success("The list has been updated")
      })
      }

    • @iamantoon
      @iamantoon 7 месяцев назад

      Пока не получается сделать правильно, у меня такой код в сервисе:
      getLists(){
      return this.http.get(this.baseUrl);
      }
      Такой в компоненте, где эти данные отрисовуются:
      ngOnInit(): void {
      this.listsService.getLists().subscribe({
      next: lists => {
      this.lists = lists.lists;
      this.listsNames = lists.listNames;
      }
      })
      }
      Такой в компоненте, где данные меняются:
      editList(){
      this.listsService.editList(this.id, this.name).subscribe({
      next: () => this.toastr.success("The list has been updated")
      })
      }

  • @YuriiD-y1b
    @YuriiD-y1b 2 года назад +2

    Cool

  • @Wunderwaffe2333
    @Wunderwaffe2333 2 года назад +1

    perfect

  • @zalip4129
    @zalip4129 Месяц назад

    так и не понял для чего нужен ngDoCheck

    • @grommaks
      @grommaks  Месяц назад

      Когда нужен свой change detection механизм.
      Например в компоненте рисуется /D3/SVG/Canvas и нужно синхронизировать со стейтом angular. SVG ангулар может сам обрабатывать, но вот D3 синхронизацию уже нужна такая гибкость