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

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

| async

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

43 ответов

29 просмотров

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 в одно функци...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта