169 похожих чатов

Ребят, подскажите пожалуйста, у меня приложение со стратегией OnPush. Есть

компонент (пусть будет компонент "Х") редактирования сущности (сущность - объект с кучей разных полей), эта сущность ранее приходила в компонент Х через @Input, причем если правильно помню, как readOnly (насколько я понял - потому что это строка из обсервабл массива), поэтому я его клонировал и дальше изменял, путем двустороннего байндинга полей этой сущности к селектбоксам компонента Х.

Затем потребовалось приделать к этому компоненту Х роутинг, поэтому возник вопрос как передавать туда данные. Я стал передавать uid сущности через url params, создал в компоненте переменную BehaviorSubject и из компонента запрашиваю по uid объект для редактирования, в подписке на запрос присваиваю BehaviorSubject новое значение (объект для будущего редактирования). Затем я в каждом селектбоксе компонента X отображаю данные этой сущности через односторонний байндинг с асинк пайпом (двусторонний тут уже не работает), и с помощью ивентов изменения селектбоксов получаю текущее значение BehaviorSubject через метод getValue(), редактирую в нем данные и сохраняю в BehaviorSubject, которые потом улетает на сервер put запросом.
<dx-select-box
[value]="(currentTicket$ | async).type"
(valueChange)="changeTicketType($event)"
>
</dx-select-box>
changeTicketType (ticketType: TicketType): void {
let currentTicket = this.currentTicket$.getValue()
currentTicket.type = ticketType
this.currentTicket$.next(currentTicket)
}
Вроде все работает, однако я тут прочитал, что использовать BehaviorSubject.getValue() - нужно в крайних случаях, как тогда можно изменить мою концепцию, чтобы было более корректно?
"Important note from the author of RxJS 5: Using getValue() is a HUGE red flag you're doing something wrong. It's there as an escape hatch. Generally everything you do with RxJS should be declarative. getValue() is imperative. If you're using getValue(), there's a 99.9% chance you're doing something wrong or weird."

10 ответов

5 просмотров

Банально можно достать value из асинк пайпа [lalala] = "(value$ | async as myValue).type" (change)="callback($event, myValue)" Но: 1) getValue будет костылем для серьезной асинхронной логики, а в использовании его для хранения внутреннего состояния проблемы не вижу, тут почти негде накосячить 2) возможно, вам удастся вообще не использовать bSubject, у меня бывали такие случаи, смог переделать на обычную проперти

И еще, плохая практика кидать один и тот же объект в сабжект, вы же не знаете, может у подписчика distinctUntilChanged стоит

Leonid-Симаков Автор вопроса
Raman Yazvinski
Банально можно достать value из асинк пайпа [lalal...

какие вообще есть способы обойтись без асинк пайпов при асинхронном запросе данных в компоненте?

Leonid Симаков
какие вообще есть способы обойтись без асинк пайпо...

Например можно просто не использовать асинк пайпы. Использовать fetch, HttpClient и всё такое

Leonid-Симаков Автор вопроса
Raman Yazvinski
Покажите, как вы данные получаете

ngOnInit (): void { this.loading$.next(true) this.subs.sink = this.ticketsService.fetchTicketByUID(this.ticketUID) .subscribe({ next: ticket => { this.loading$.next(false) this.currentTicket$.next(ticket) }, error: err => { console.log(err) this.loading$.next(false) } }) this.subs.sink = this.ticketTypesService.fetchTicketTypes() .subscribe(res => this.ticketTypes.next(res)) }

Leonid Симаков
ngOnInit (): void { this.loading$.next(true) ...

async pipe норм, можно сделать просто подписки по-другому readonly data$ = combineLatest({ticket: this.ticketsService.fetchTicketByUID(this.ticketUID), ticketType: this.ticketTypesService.fetchTicketTypes()}); и в темплейте <ng-container *ngIf="data$ | async as data"> <my-component [value]="data.ticket"></> </>

Leonid-Симаков Автор вопроса
nik pol
Например можно просто не использовать асинк пайпы....

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

Leonid Симаков
httpClient я и так вроде использую для запросов, н...

Ну просто объект с данными привяжите и посмотрите сработает ли changeDetection

Leonid-Симаков Автор вопроса
nik pol
Ну просто объект с данными привяжите и посмотрите ...

я уже пробовал сперва так сделать, у меня отображался полупустой компонент со статичными данными

Похожие вопросы

Обсуждают сегодня

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Народ, кто шарит в расширенных разделах (EBR/EPR) на дисках с разметками MBR? Везде пишут (в вики рус/англ) в частности + другие источники смотрел, что первый сектор расширенн...
Eugene Krasnikov (ᴊɪɴ x)
1
что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Карта сайта