Size: a a a

Советский Angular

2021 March 02

IE

Igor' Ember in Советский Angular
Igor' Ember
Не.
Обс возникает в результате http запроса.
В нём в subscibe я подписываюсь на изменения и запихиваю их behSubject, который хранит в себе актуальные данные.
Есть ещё данные для отображения. Доступ к ним получается через this.displayed$ = this.behSubject.asObservable() и в тимплейте уже displayed$ отображается через async  пайп.
В том-то и дело что у меня какие-то странные цепочки получаются. Обс преобразовала в сабжект, потом сабджект запихнула в другой обс через asObservable и тп. Ощущение будто я борюсь с библиотекой, изобретая костыли и обходя её ограничения.
источник

IE

Igor' Ember in Советский Angular
Smooth Operator
кажется тебе нужен shareReplay()
Я его использую
источник

C☭

Chadwick ☭ in Советский Angular
Igor' Ember
В том-то и дело что у меня какие-то странные цепочки получаются. Обс преобразовала в сабжект, потом сабджект запихнула в другой обс через asObservable и тп. Ощущение будто я борюсь с библиотекой, изобретая костыли и обходя её ограничения.
+
источник

S

Shmalala in Советский Angular
Лайк! Вы повысили рейтинг пользователя Dariya Vetrova.
Теперь его рейтинг: 2 ❤️
источник

MA

Maxim Afanasev in Советский Angular
Igor' Ember
В том-то и дело что у меня какие-то странные цепочки получаются. Обс преобразовала в сабжект, потом сабджект запихнула в другой обс через asObservable и тп. Ощущение будто я борюсь с библиотекой, изобретая костыли и обходя её ограничения.
А зачем результат запроса класть в сабжект? Он ведь уже Observable, можно работать с ним.
источник

S

Smooth Operator in Советский Angular
Igor' Ember
Я его использую
я бы посмотрел как
источник

S

Smooth Operator in Советский Angular
а то ситуация у вас странная
источник

IE

Igor' Ember in Советский Angular
Maxim Afanasev
А зачем результат запроса класть в сабжект? Он ведь уже Observable, можно работать с ним.
Так нельзя. Данные, которые отображаются в тимплейте, подразумеваются динамическими (условно, мне нужно выпонлять фильтрацию). В Обс не позволит мне в него новые значения положить, поэтому и пришлось к subject прибегнуть.
Ситуация могла быть другой, если бы можно было сделать из события клика другой обс и тогда уже через  combineLatest смешивать их, а в тимплейте отображать результирующий обс. Но это тоже громоздко. Пойду наверное best practices гуглить по RxJS
источник

IE

Igor' Ember in Советский Angular
Smooth Operator
я бы посмотрел как
выяснилось, что shareReply не нужен был, потому что второй subject просто рудиментом оказался (от предыдущих попыток заставить это работать) и никакой функции не несёт.
Пока что есть items$ (обс, не для отображения) и disaplayed$ (behaviorSubject), который для отображения.

Если нужно отфильтровать, то вызывается displayed$.getValue()  и затем displayed$.next(filtered);
источник

MA

Maxim Afanasev in Советский Angular
Igor' Ember
Так нельзя. Данные, которые отображаются в тимплейте, подразумеваются динамическими (условно, мне нужно выпонлять фильтрацию). В Обс не позволит мне в него новые значения положить, поэтому и пришлось к subject прибегнуть.
Ситуация могла быть другой, если бы можно было сделать из события клика другой обс и тогда уже через  combineLatest смешивать их, а в тимплейте отображать результирующий обс. Но это тоже громоздко. Пойду наверное best practices гуглить по RxJS
Смотрите, у вас есть состояние вашего фильтра. Его мы храним в сабжекте. И есть удалённое состояние - это ваши данные. Про них надо знать две вещи:
1. Это состояние не реактивное, т.е. вам нужно его перезапрашивать в тот момент, когда вы решите, что пора.
2. У него есть параметр - это состояние вашего фильтра. В зависимости от него, данные будут разные.
Таким образом, ваши данные можно описать так:
data$ = filterState$.pipe(
 switchMap(value => dataApi.getFiltered(value))
)
И тогда при каждом изменении состояния фильтра вы их будете перезапрашивать.
источник

IE

Igor' Ember in Советский Angular
Maxim Afanasev
Смотрите, у вас есть состояние вашего фильтра. Его мы храним в сабжекте. И есть удалённое состояние - это ваши данные. Про них надо знать две вещи:
1. Это состояние не реактивное, т.е. вам нужно его перезапрашивать в тот момент, когда вы решите, что пора.
2. У него есть параметр - это состояние вашего фильтра. В зависимости от него, данные будут разные.
Таким образом, ваши данные можно описать так:
data$ = filterState$.pipe(
 switchMap(value => dataApi.getFiltered(value))
)
И тогда при каждом изменении состояния фильтра вы их будете перезапрашивать.
Не-не, перезапрашивать смысла нет, это же куча запросов лишних.
Но логику я примерно поняла. Можно их фильтрации сделать свой поток и потом объединять их с потоком данных (через combineLatest), результат которого уже испольовать для отображения.
источник

MA

Maxim Afanasev in Советский Angular
Igor' Ember
Не-не, перезапрашивать смысла нет, это же куча запросов лишних.
Но логику я примерно поняла. Можно их фильтрации сделать свой поток и потом объединять их с потоком данных (через combineLatest), результат которого уже испольовать для отображения.
Перезапрашивать нет смысла только тогда, когда у вас фильтрация на клиенте.
источник

IE

Igor' Ember in Советский Angular
Maxim Afanasev
Перезапрашивать нет смысла только тогда, когда у вас фильтрация на клиенте.
не, это и есть мой случай. Фильтрацию на беке не реализовали. В задаче такое условие стоит
источник

S

Smooth Operator in Советский Angular
Igor' Ember
выяснилось, что shareReply не нужен был, потому что второй subject просто рудиментом оказался (от предыдущих попыток заставить это работать) и никакой функции не несёт.
Пока что есть items$ (обс, не для отображения) и disaplayed$ (behaviorSubject), который для отображения.

Если нужно отфильтровать, то вызывается displayed$.getValue()  и затем displayed$.next(filtered);
чет сложна
источник

A

Alex in Советский Angular
Igor' Ember
выяснилось, что shareReply не нужен был, потому что второй subject просто рудиментом оказался (от предыдущих попыток заставить это работать) и никакой функции не несёт.
Пока что есть items$ (обс, не для отображения) и disaplayed$ (behaviorSubject), который для отображения.

Если нужно отфильтровать, то вызывается displayed$.getValue()  и затем displayed$.next(filtered);
Может лучше пример на stackblitz?
источник

C☭

Chadwick ☭ in Советский Angular
Smooth Operator
чет сложна
+
источник

S

Shmalala in Советский Angular
Лайк! Вы повысили рейтинг пользователя Smooth Operator .
Теперь его рейтинг: 3 ❤️
источник

В

Владимир in Советский Angular
Smooth Operator
чет сложна
+
источник

S

Shmalala in Советский Angular
Лайк! Вы повысили рейтинг пользователя Smooth Operator .
Теперь его рейтинг: 4 ❤️
источник

С

Светлана in Советский Angular
+
источник