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

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

| async

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

43 ответов

4 просмотра

ngIf подвесь

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

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

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

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

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

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

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

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

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... } }),

xxtux Shvets
а зачем присвоение обсерваблов делать в ините или ...

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

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

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

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

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

Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
2
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
у меня программа тысяч на 10 строк. Там в основном моя собственная логика. А по содержанию она просто работает с файловой системой (мастер для бэкапов) и таблицей с данными о ...
Дмитрий Завгородний
5
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Карта сайта