| async
как дождатcя пока inventoryTypes$ отработает в шаблоне (заполнит). чтобы потом выбрать из дропдауна конкретный элемент?
ngIf подвесь
а зачем? подумайте что произойдет
это для того чтобы подписатьс в шаблоне а не в компоненте. чтобы потом отписки не делать. А что будет?
никак не могу понять взаимосвязь)
вот код сервиса: в data$ получаю данные. чтобы подписаться на них в швблоне через async. Не нравится то что ниже есть подписка на data$ чтобы выбрать дефолтное значение. И сам компонент на втором скрине: Что не так делаю?
при подписке синхронно в шаблон будет передано это же значение. смысл в подписке тут?
какеи именно значение?
котрое в of передали
итог такой. буду рад критике. Потому как не уверен в правильности подхода: @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$; } Это все!
Вынеси большую часть логики в отдельные функции, слишком много спагетти
а зачем присвоение обсерваблов делать в ините или конструкторе? присваивай сразу при создании
не сохранять тайп. ты можешь в мапе его дальше прокинуть. map((type) => { return { type, data: this.mediatorPanoMap... } }),
правило хорошего тона определять в ините
это схуяли стало правилом? особенно на фоне inject-а
вообще когда пишешь, надо чтоб сразу было видно зависимости, какая сущность из чего высчитывается. А в этих тапах отслеживать тяжело
потому что упоротые писатели доки ангуляра везде этой ерунды напихали
кто этой докой вообще пользуется, один фиг что нужно чаще всего находится в исходниках ангулара
@udalov_e пользуется, всех в доку отправляет
Когда список свойств и их присваивание находятся в разных местах это легче читать. Потому что далеко не всегда присваивание выглядит элегантно.
ух. присваивать без проблем можно при объявлении. нафига, а главное зачем, особенно с учетом того, что половина функционала будет орать, что prop is undefined
typescript strict включи и насладись лутшей крактикой
И начинаем "!!!")
Не будет ничего орать
будет, будет
а нормально ли в tap пробрасывать сабджект? или лучше отдельный поток создать на основе текущего потока?
нет. чистые сабжекты нужны лишь для того, чтобы отправлять команды. Использовать их для кэша не нужно. Это просто хуже читается, чем формирование новых потоков через операторы
как тогда в моем случае переписать это? Так? 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 ?
ну типа того, а стейт тебе зачем? и зачем ты сетаешь уже существующее значение
я пытаюсь найти ранее сохраненное значение в мэпе и вернуть его в value$ . Вы о каком месте?
куда вернуть? у тебя tap ничего не возвращает и не должен
блин(( мэп там вместо tap
исправил
ну лучше. можно 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)?
а вот тут уже сабжект, кидаем в него значение в onCanged и смешиваем потоки. т.е. сабжект будет вторым источником информации
onChanged$ = new Subject(); onChanged(e) {this.onChanged.next(e)}; а дальше что с чем мержить? мне там нужен же types$
если вам нужно иметь types и changed в одно функции, то это будет combineLatest который будет вызываться при каждом изменении любого из них. Только надо будет проследить чтобы были начальные значения, т.к. комбайн ждет эмитов всех "участников"
Спасибо! хотел бы попросить взглянуть на результат - может еще какие-то странности заметите?
Обсуждают сегодня