Size: a a a

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

2019 September 30

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Andrew Ostrovskii
ребят, вопрос, насколько адекватно делать каждый раз вот так, вместо
.next(product)
Так каждый раз ссылка новая будет

Почему next не устраивает?
источник

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Oleg Safonov
Так каждый раз ссылка новая будет

Почему next не устраивает?
Это понятно. Но это может что-то поломать
источник

IK

ILshat Khamitov in Angular - русскоговорящее сообщество
По идее если он пуш то ниче не будет происходить
источник

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Oleg Safonov
Так каждый раз ссылка новая будет

Почему next не устраивает?
Мне нуэно передавать в сам Subject product каждый раз. Я не могу передать null, это всё сломает.

А продукт у меня только внутри .subscribe
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Andrew Ostrovskii
Это понятно. Но это может что-то поломать
Ну может в теории аукнутся где угодно) плюс пользователи этого кода не зная этой особенности могут использовать неправильно его
источник

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Oleg Safonov
Ну может в теории аукнутся где угодно) плюс пользователи этого кода не зная этой особенности могут использовать неправильно его
Всё же, буду благодрен, если будет больше конкретики :)
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Andrew Ostrovskii
Мне нуэно передавать в сам Subject product каждый раз. Я не могу передать null, это всё сломает.

А продукт у меня только внутри .subscribe
Ну это так скажем выглядит сомнительно) дело то конечно за вами, но подумайте дважды)
источник

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Но каких-то утечек с аккамулируемым сасбскрибшн быть не должно, так?
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Andrew Ostrovskii
Но каких-то утечек с аккамулируемым сасбскрибшн быть не должно, так?
Тут нужны rxjs гуру)
источник

Вキ

Вертихвост キバ in Angular - русскоговорящее сообщество
Andrew Ostrovskii
Но каких-то утечек с аккамулируемым сасбскрибшн быть не должно, так?
А ансасбскрибшн есть?
источник

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Вертихвост キバ
А ансасбскрибшн есть?
нет. Хотя в самом первом .subscribe есть .takeUntil
источник

AO

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

Вキ

Вертихвост キバ in Angular - русскоговорящее сообщество
Вертихвост キバ
Прошу прощения, что встреваю в обсуждение.

Первое, на что прошу обратить внимание: никогда не нужно допускать подобных конструкций, когда из subscribe или tap идет запись данный в текущий контекст. Например, когда делается subscribe((data) => this.data = data)this.data = data).

Второе, не надо делать подписки в подписке. Когда делается любая подписка, то необходимо позаботиться, чтобы ее уничтожить. Например, .subscribe((data) => smth.subscribe(() => …)).

И вот как решить эти проблемы.

Не делайте подписок. Даже если очень хочется, старайтесь их избегать. Да, есть ситуации, когда необходимо сделать их, но в данном случае она не требуется.
https://t.me/angular_fox/81

Используйте AsyncPipe для того, чтобы минимизировать количество необходимых подписок. Тут потребуется понимание, что такое multicasting.
https://t.me/angular_fox/73

Используйте switchMap, mergeMap, concatMap, exhaustMap, чтобы не делать внутренних подписок. Это 4 разные стратегии работы с вложенными потоками.
https://t.me/angular_fox/96
https://blog.angularindepth.com/11e5b2efe293

И самое главное, работая с RxJS всегда необходимо оперировать потоками.

Теперь, учитывая все выше перечисленное, итоговый код может выглядеть следующим образом:
user: Observable<User> =
 userService.getUser().pipe(
   filter(notNull));

userId: Observable<number> =
 user.pipe(
   pluck(‘id’));

userInfo: Observable<UserInfo> =
 userId.pipe(
   switchMap((userId) => userService.getUser(userId)));


И все что осталось сделать, это отобразить пользователя в шаблоне, если требуется. Просто воспользуемся AsyncPipe, и выведем в виде json:
<pre>{{ userInfo | async | json }}</pre>
Для начала, вот это будет хорошим ответом, так как он уже покрывает большинство проблем с этим кодом.

Хорошей практикой является оставлять потоки целостными. И если хочется, как-то изменить поток, то ему надо дать команду сверху (Subject.next). Поэтому создавать новый BehaviorSubject не стоит.

Скорее всего вы хотели сделать multicasting, и есть уже готовые операторы для этого, например shareReplay({ refCount: true, bufferSize: 1 }).
источник

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Вертихвост キバ
Для начала, вот это будет хорошим ответом, так как он уже покрывает большинство проблем с этим кодом.

Хорошей практикой является оставлять потоки целостными. И если хочется, как-то изменить поток, то ему надо дать команду сверху (Subject.next). Поэтому создавать новый BehaviorSubject не стоит.

Скорее всего вы хотели сделать multicasting, и есть уже готовые операторы для этого, например shareReplay({ refCount: true, bufferSize: 1 }).
Спасибо, почитаю. Не знаю что-такое мультикастинг.

Причина, почему я делаю такие вещи немного другая. У меня есть компонент, как видно, который шлёт запрос на сервер и получает продукт.

В зависимости от того, есть ли продукт или нет во вью компонента рисуеться дочерний компонент diagram

В зависимости от смены routeParams диаграма перерисовываеться. Я пытаюсб добитья этого передавая Subject через @Input и слушая этот Subject в дочернем компоненте

И вот тут начинается моя проблема. При 1 загрузке мне нужно дать знать компоненту диаграммы, что ему нужно отрисовать себя 1-й раз. Но сама итерация ChangeDetection цикла происходит уже после моего коллбека в subscribe в котором я эмичу Subject, который должен отрисовывать/перерисовывать диаграму

Отсюда и такие костыли
источник

AO

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

AO

Andrew Ostrovskii in Angular - русскоговорящее сообщество
Т.е., если я в ручную сделаю detectChanges() внутри .subscribe() проблема уйдет. Но, у меня нет OnPush, так что, мне кажеться это еще большим костылем
источник

I

I k O g h q T W q in Angular - русскоговорящее сообщество
я уже задрался и так и сяк, мб кто подскажет, он ругается что валидация неправильная
источник

I

I k O g h q T W q in Angular - русскоговорящее сообщество
источник

I

I k O g h q T W q in Angular - русскоговорящее сообщество
когда ложу его внутрь объекта label, перестает ругатся, но ничего не выводит
источник

KA

Kulagin Alex in Angular - русскоговорящее сообщество
Кажется у тебя разная область видимости для #backgroundColor
источник