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

Есть такой поток в конструкторе компонента: this.inventoryTypes$ = this.inventoryDropdownService.data$; потом: inventoryTypes$

| async

как дождатcя пока inventoryTypes$ отработает в шаблоне (заполнит). чтобы потом выбрать из дропдауна конкретный элемент?

43 ответов

26 просмотров

ngIf подвесь

Oleh-P Автор вопроса
xxtux Shvets
ngIf подвесь

есть ли смысл в такой записи или просто в переменную без of()?

Oleh-P Автор вопроса
xxtux Shvets
а зачем? подумайте что произойдет

это для того чтобы подписатьс в шаблоне а не в компоненте. чтобы потом отписки не делать. А что будет?

Oleh-P Автор вопроса
Aleksey Solokhin
никак не могу понять взаимосвязь)

вот код сервиса: в data$ получаю данные. чтобы подписаться на них в швблоне через async. Не нравится то что ниже есть подписка на data$ чтобы выбрать дефолтное значение. И сам компонент на втором скрине: Что не так делаю?

Oleh P
это для того чтобы подписатьс в шаблоне а не в ком...

при подписке синхронно в шаблон будет передано это же значение. смысл в подписке тут?

Oleh P
какеи именно значение?

котрое в of передали

Oleh-P Автор вопроса
xxtux Shvets
при подписке синхронно в шаблон будет передано это...

итог такой. буду рад критике. Потому как не уверен в правильности подхода: @Injectable({ providedIn: 'root', }) export class InventoryDropdownService { public state = new Map<string, number>(); public types$: Observable<any>; public value$ = new BehaviorSubject<number>(null); public type: 'point' | 'rect'; constructor(private mediatorPanoMap: MediatorPanoMap) { this.types$ = this.mediatorPanoMap.panoRef.state.addFeature$.pipe( filter(Boolean), tap(({ type }) => (this.type = type)), map(({ type }) => { return this.mediatorPanoMap.inventoryService.taskInventory .get(this.mediatorPanoMap.inventoryService.taskForInventarization.id) .filter((inventory: any) => { const { geometrytype, objectdisplaysettings } = inventory; const { markingMethod } = objectdisplaysettings; return ( geometrytype === GeometryType.Point && markingMethod === (type == 'point' ? MarkingType.Point : MarkingType.Rect) ); }); }), tap((types) => { const [type] = types; if (this.state.has(this.type)) { this.setValue(this.state.get(this.type)); } else if (types.length == 1) { this.setValue(type.id); } }) ); } setValue(inventoryid: number) { this.value$.next(inventoryid); this.state.set(this.type, inventoryid); } } Внешний мир подписывается так: ngOnInit(): void { this.types$ = this.inventoryDropdownService.types$; this.value$ = this.inventoryDropdownService.value$; } Это все!

Oleh P
итог такой. буду рад критике. Потому как не уверен...

Вынеси большую часть логики в отдельные функции, слишком много спагетти

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

Oleh P
итог такой. буду рад критике. Потому как не уверен...

не сохранять тайп. ты можешь в мапе его дальше прокинуть. map((type) => { return { type, data: this.mediatorPanoMap... } }),

Aleksey Solokhin
правило хорошего тона определять в ините

это схуяли стало правилом? особенно на фоне inject-а

Oleh P
итог такой. буду рад критике. Потому как не уверен...

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

Evgheni Чернявский
это схуяли стало правилом? особенно на фоне inject...

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

xxtux Shvets
потому что упоротые писатели доки ангуляра везде э...

кто этой докой вообще пользуется, один фиг что нужно чаще всего находится в исходниках ангулара

Evgheni Чернявский
это схуяли стало правилом? особенно на фоне inject...

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

Aleksey Solokhin
Когда список свойств и их присваивание находятся в...

ух. присваивать без проблем можно при объявлении. нафига, а главное зачем, особенно с учетом того, что половина функционала будет орать, что prop is undefined

Aleksey Solokhin
Когда список свойств и их присваивание находятся в...

typescript strict включи и насладись лутшей крактикой

Oleh-P Автор вопроса
xxtux Shvets
вообще когда пишешь, надо чтоб сразу было видно за...

а нормально ли в tap пробрасывать сабджект? или лучше отдельный поток создать на основе текущего потока?

Oleh P
а нормально ли в tap пробрасывать сабджект? или лу...

нет. чистые сабжекты нужны лишь для того, чтобы отправлять команды. Использовать их для кэша не нужно. Это просто хуже читается, чем формирование новых потоков через операторы

Oleh-P Автор вопроса
xxtux Shvets
нет. чистые сабжекты нужны лишь для того, чтобы о...

как тогда в моем случае переписать это? Так? this.value$ = this.types$.pipe(( tap((types) => { const [type] = types; if (this.state.has(this.type)) { this.state.set(this.type, this.state.get(this.type))); } else if (types.length == 1) { this.state.set(type.id); } })) Потом в шаблоне: view$ | async ?

Oleh P
как тогда в моем случае переписать это? Так? thi...

ну типа того, а стейт тебе зачем? и зачем ты сетаешь уже существующее значение

Oleh-P Автор вопроса
xxtux Shvets
ну типа того, а стейт тебе зачем? и зачем ты сетае...

я пытаюсь найти ранее сохраненное значение в мэпе и вернуть его в value$ . Вы о каком месте?

куда вернуть? у тебя tap ничего не возвращает и не должен

Oleh-P Автор вопроса
Oleh-P Автор вопроса
Oleh P
исправил

ну лучше. можно if !has { set }; return get

Oleh-P Автор вопроса
xxtux Shvets
ну лучше. можно if !has { set }; return get

this.value$ = this.types$.pipe( map((types: any[]) => { const [type] = types; if (this.state.has(this.type)) { return this.state.get(this.type); } else if (types.length == 1) { this.setValue(type.id); } return this.state.get(this.type); }) ); возникает вопрос. как забросить в $value значение когда он будет выбрано вручную из дропдауна по событию onChanged($event)?

Oleh P
this.value$ = this.types$.pipe( map((typ...

а вот тут уже сабжект, кидаем в него значение в onCanged и смешиваем потоки. т.е. сабжект будет вторым источником информации

Oleh-P Автор вопроса
xxtux Shvets
а вот тут уже сабжект, кидаем в него значение в on...

onChanged$ = new Subject(); onChanged(e) {this.onChanged.next(e)}; а дальше что с чем мержить? мне там нужен же types$

Oleh P
onChanged$ = new Subject(); onChanged(e) {this.o...

если вам нужно иметь types и changed в одно функции, то это будет combineLatest который будет вызываться при каждом изменении любого из них. Только надо будет проследить чтобы были начальные значения, т.к. комбайн ждет эмитов всех "участников"

Oleh-P Автор вопроса
xxtux Shvets
если вам нужно иметь types и changed в одно функци...

Спасибо! хотел бы попросить взглянуть на результат - может еще какие-то странности заметите?

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Карта сайта