首页 > 解决方案 > Angular指令如何设置上下文变量泛型类型?

问题描述

我在这个问题上面临同样的问题由于那里没有答案,我会试着问。

我创建了一个指令ngStream,它将订阅一个可观察的,并且在组件被销毁后自动取消订阅,我知道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();
    }
}

我计划改进这段代码,但现在我只需要让它以正确的方式工作,它正在工作,唯一的问题是我无法为我的 定义泛型类型value,例如:

*ngFor="let i of [0, 1, 2...]"

在这种情况下,变量i将是一个number类型,如果我更改列表的类型,变量也会更改它的类型,正如您可能知道的那样。

就我而言:

observable$: Observable<String>
*ngStream="let stream of observable$"

变量流是一种any类型,我想不出设置返回类型的方法,我也看到了这个问题,似乎有同样的问题,没有解决方案。

标签: angularangular2-directives

解决方案


推荐阅读