【问题标题】:Why does new data to an async pipe not cause data to rerender?为什么异步管道的新数据不会导致数据重新呈现?
【发布时间】:2020-09-30 10:21:04
【问题描述】:

我已经阅读了很多关于 Angular/ReactJS 的背景知识,并试图很好地理解生命周期钩子以及它们如何一起发挥作用,但仍然让我感到困惑的是以下场景。

假设您有一个 someService,并且在该服务中定义了一个名为 someBehaviorSubject 的 BehaviorSubject。它在 someService 中定义为:

public someBehaviorSubject= new BehaviorSubject<someInterface[]>([]);

然后该行为主题订阅someAPIcall(argument: string): void。 someService.someAPIcall 定义为:

someAPIcall(argument: string): void {
  this.http.get<someInterface[]>(argument).subscribe(this.someBehaviorSubject);
}

someInterface 定义为:

interface someInterface {
  data: string
}

假设有一个名为 someParent 的父组件和一个名为 someChild 的子组件。 someParent 有两个按钮调用:

someService.someAPIcall("A");

someService.someAPIcall("B");

分别。 someChild 在模板中有以下内容:

<div*ngFor="let data of someService.someBehaviorSubject | async">
  {{data}}
</div>

在我的观察中,当您单击 someParent 中的按钮 A 或按钮 B 时,数据会正确呈现数据集 A 或 B。但是,如果您在第一组数据呈现后单击另一个按钮 不会 使用新数据集重新渲染数据。我希望它会通过直接订阅 BehaviorSubject 的异步管道。不明白为什么不重绘数据?

【问题讨论】:

    标签: angular reactjs behaviorsubject


    【解决方案1】:

    要更新BehaviorSubject 值,您需要使用next() 函数,该函数会将新值推送到BehaviorSubject

    例子:

    someAPIcall(argument: string): void {
      this.http.get<someInterface[]>(argument).subscribe(data => 
    {
       this.someBehaviorSubject.next(data); 
    });}
    

    有关 RxJS 主题的更多信息,请考虑查看documentation

    【讨论】:

    • 这基本上是正确的!正如这里的文档中提到的:rxjs-dev.firebaseapp.com/guide/subject BehaviorSubject 本身就是一个观察者和可观察者。我不必用“asObservable”来投射它。我错过的那部分正在调用下一个。出于某种原因,我认为这是隐含的,因此您不必明确调用它。如果您更新答案,我会接受这个!非常感谢您的帮助!
    • 谢谢,我很高兴它成功了......我更新了我的答案。
    猜你喜欢
    • 2016-06-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多