Я столкнулся с той же проблемой из этого вопроса , и, поскольку там нет ответа, я попытаюсь спросить.
Я создал директиву ngStream
, которая будет подписываться к наблюдаемому и автоматически c отказаться от подписки после уничтожения компонента, я знаю, что канал async
существует, но для него требуется массив типа: Observable<T[]>
, поэтому я решил создать эту директиву, которая позволяет подписаться на обычный Observable<T>
и мне не нужно генерировать массив из одного элемента, вот что у меня есть, и он работает:
export class NgStreamDirective implements OnDestroy {
@Input('ngStreamOf') set values(obs: Observable<any>) {
this.subscription = obs.subscribe((o) => {
this.value = o;
if (this.embeddedRef === undefined) {
this.embeddedRef = this._viewContainer.createEmbeddedView(this._template, { "\$implicit": this.value });
} else {
this.embeddedRef.context.$implicit = this.value;
this.embeddedRef.detectChanges();
}
});
}
private subscription: Subscription;
private value: any;
private embeddedRef: EmbeddedViewRef<any>;
constructor(
private _template: TemplateRef<any>,
private _viewContainer: ViewContainerRef
) {}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}
}
Я планирую улучшить этот код, но сейчас мне просто нужно чтобы он работал правильно, и он работает, единственная проблема в том, что я не могу определить тип generi c для моего value
, например:
*ngFor="let i of [0, 1, 2...]"
В этом случае переменная i
будет иметь тип number
, если я изменю тип списка, переменная также изменит свой тип, как вы, вероятно, знаете.
В моем случае:
observable$: Observable<String>
*ngStream="let stream of observable$"
Переменный поток имеет тип any
, и я не могу понять способ установки типа возврата, я также видел эту проблему , которая, похоже, имеет ту же проблему и не имеет решения.