更改ngForOf以从行为主题中获取Iterable

时间:2018-05-30 12:43:02

标签: angular directive angular2-directives

对于我的应用程序我希望有一个像ngForOf(https://github.com/angular/angular/blob/master/packages/common/src/directives/ng_for_of.ts)这样的指令,但我没有从Input()获取可迭代对象,而是希望从指令Class中的行为主题获取。

使用Host类中的Behavior Subject,如:

BehaviourSubject.subscribe((value) => {this.items = value})

<comp ngFor="let item of item"></comp>

不是一种选择。相反,我想在指令中开始订阅。

我想使用这样的指令:

 <comp *ngFor></comp>

任何使这项工作的想法? (来自ngForCode的变化)

1 个答案:

答案 0 :(得分:0)

未经测试,但要给你一个想法:

@Directive({
  selector: '[forBs]'
})
export class ForBs<T> extends NgForOf<T> {

  @Input()
  forBs: BehaviorSubject<NgIterable<T>> = new BehaviorSubject([]);

  get ngForOf(): NgIterable<T> {
    return this.forBs.getValue();
  }

  constructor(_viewContainer: ViewContainerRef, _template: TemplateRef<NgForOfContext<T>>, _differs: IterableDiffers) {
    super(_viewContainer, _template, _differs);
  }
}

这可能没有模板,trackBy支持..以及onChangesdoCheck挂钩可能还有其他一些问题。但话说回来,这将有助于你走上正轨。

用法如下:

<comp *forBs="item$"></comp>

哪里

item$ = new BehaviourSubject([]);

但话说回来,你也可以使用async管道;)

<comp *ngFor="let item of item$ | async"></comp>