【问题标题】:Why does the async pipe not subscribe to observable inialized in the constructor为什么异步管道不订阅构造函数中初始化的可观察对象
【发布时间】:2021-07-05 12:29:04
【问题描述】:

请参阅此 plunkr 以获取插图:https://plnkr.co/edit/Tm4AW0sU0pumBA8I?open=lib%2Fapp.ts&deferRun=1

我在类初始化器中声明所有内容的组件 1:

@Component({
  template: '{{ data$ | async | json }}',
  selector: 'app-data'
})
export class AppData {
  readonly id$ = new Subject();
  readonly data$ = this.id$.pipe(
    switchMap(id => of(`id = ${id}`))
  );

  @Input()
  set id(val: number) {
    this.id$.next(val)
  }
}

以及我创建 observable onInit 的组件 2:

@Component({
  template: '{{ data$ | async | json }}',
  selector: 'app-data-oninit'
})
export class AppDataOnInit implements OnInit {

  @Input()
  id: number;

  data$: any;


  ngOnInit(): void {
    this.data$ = of(`id = ${this.id}`)
  }
}

我试图在组件构造器或类初始化器中声明可观察对象,但异步管道没有在那里订阅它。但是,如果我在 ngOnInit 中实例化 observable,它会按预期工作。

我整天都在寻找对此的解释,但一无所获。这里缺少的拼图是什么?

我觉得在创建类时声明可观察对象更有意义。

【问题讨论】:

    标签: angular rxjs reactive-programming


    【解决方案1】:

    异步管道正在订阅您的data$,但此订阅发生在 id$ 发出之后。如果您希望迟到的订阅者收到之前的发射,您可以使用ReplaySubject 而不是普通的Subject

    readonly id$ = new ReplaySubject(1);
    

    【讨论】:

    • 这就是我想要的。非常感谢
    猜你喜欢
    • 2021-08-07
    • 2020-06-28
    • 2019-10-23
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2018-06-04
    相关资源
    最近更新 更多