Size: a a a

Angular - русскоговорящее сообщество

2021 May 08

V

Viktor in Angular - русскоговорящее сообщество
У вас не дергается чендж детектор и из за этого не перерисовывается компонент
источник

В

Влад in Angular - русскоговорящее сообщество
а можете объяснить простыми словами, чем он отличается от подписки?

Может чендж детектор не работает для дочерних компонентов?
источник

V

Viktor in Angular - русскоговорящее сообщество
А у вас есть пример на стак блиц чтоб посмотреть, возможно мы о разных вещах думаем)
источник

В

Влад in Angular - русскоговорящее сообщество
на чем?) я только начинаю изучать ангуляр, и еще мало терминов понимаю)

А по поводу подписки, то я почему спрашиваю. Я боюсь что большой уровень вложенности приведет к утечке памяти, если я буду в каждом компоненте подписываться на обновления.
Поэтому и хочу узнать какие бывают способы
источник

V

Viktor in Angular - русскоговорящее сообщество
ну вот чтоб этого избежать как раз асинк пайп нужно использовать

Если вы подпивываетесь вручную - то вам следует следить за подпиской и отписываться при дестрое компонента
Асинк пайп позволяет об этом не думать - он сам закомплитит подписку когда компонент задестроится
источник

В

Влад in Angular - русскоговорящее сообщество
Звучит неплохо, пойду пробовать
источник

V

Viktor in Angular - русскоговорящее сообщество
источник

V

Viktor in Angular - русскоговорящее сообщество
чендж детектор отрабатывает когда в инпут прилетает новое значение

В случае с примитивами - все окей, но в случае со ссылочными типами есть неочевидная штука - вот как у вас - категории - это массив. вы его как-му мутируете и ожидаете что компонент перерисуется

Но массив ссылочный тип, когда вы меняете массив используя  Array.push() у вас массив изменится но ссылка на массив останется прежней
получается что значение переданное в инпут - не меняется

Поэтому вам было предложено использовать спред оператор - используя его вы не мутируете исходный массив а создаете каждый раз новый с новыми данными - таким образом у вас всегда новая ссылка должна передаваться в инпут что должно быть командой ангуляру перерисовать компонент
источник

В

Влад in Angular - русскоговорящее сообщество
Статья платная(

Я сделал так:
<app-category-list [parent_id]="currentArtifactId" [categories]="this.MyService.categories | async"></app-category-list>

В компоненте category-list:
@Input('categories') categories: any;

ngOnChanges()
{
   console.log('ngOnChanges', this.categories);
}

Изменений не видно. Спасибо за разъяснение. А у меня не получилось использовать спред оператор, сложная структура, не понимаю как вставить внутрь массива:

categories = new BehaviorSubject({
   'all': {
       'type_1': [], // Категории, вот сюда нужно вставить новую
       'type_2': [],
   },
});

Как в таком случае использовать спред оператор?
источник

🏡К

🏡 Назар Калитюк... in Angular - русскоговорящее сообщество
в инкогнито открой
источник

В

Влад in Angular - русскоговорящее сообщество
спасибо 👍
источник

SC

Serega Carbon in Angular - русскоговорящее сообщество
она уже взлетела и даже села, успокойтесь)
источник

В

Влад in Angular - русскоговорящее сообщество
Вопрос, если при push массив остается прежним и не детектится изменение, то почему в родительском компоненте детектится? Там где есть subscribe
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
в родителе ngFor?
источник

В

Влад in Angular - русскоговорящее сообщество
да, а что должно быть?
источник

В

Влад in Angular - русскоговорящее сообщество
точнее, я сначала перебираю массив, выбираю из него нужные, сортирую, и затем в виде ngFor
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
ngFor проверяет на мутации массив
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
на каждый ченж детекшен
источник
2021 May 09

В

Влад in Angular - русскоговорящее сообщество
Опытным путем я определил, что изменения все таки детектятся, но при условии, что вывожу данные как есть, прямо из инпута в цикле *ngFor.

А если обработать данные предварительно, и положить в локальную переменную this.currentCategoriesList, то при создании новой категории она уже не появляется. Попробовал так:
this.currentCategoriesList = [...this.currentCategoriesList, newCategoryObj];

Не сработало. Почему при обработке не детектятся изменения?
источник

RY

Roman Yazvinsky in Angular - русскоговорящее сообщество
Если в асинхронном коллбэке (subscribe), то изменения не сразу обнаружатся, т.к. cd не будет запущен (при onPush, конечно же)
источник