当前位置: 首页 > 知识库问答 >
问题:

如何调试RxJS/Angular?发出新值时视图不更新

何和惬
2023-03-14

我真的用这个把我的头撞到墙上了…:-\

我有一个哑组件,它具有接收数组的@Input()

export class ChildComponent implements OnChanges {

  @Input() items: Item[];

  ngOnChanges(changes: SimpleChanges) {
    console.log('ngOnChanges fired:', changes['items'].currentValue.length)
  }
}

父组件通过模板绑定和async管道将数组传递给子组件:

<h1>Parent Component</h1>

<child [items]="items$ | async"></child>

这样做正确吗?

但是,items$发出新值时,子组件中不会激发ngOnChanges

我有一个数据存储类来维护这个可观察的项目数组。获取新项目时,它会生成一个新数组(不可变),并将其推送到items$observable。但是,在子组件中未检测到更改。如果我在页面周围单击一点,最终将启动更改检测,它将更新。

关键是:我在StackBlitz上创建了一个问题示例,结果发现它在那里工作得很好!!!!

因此,我知道我的真实代码与简化的示例有所不同,但我一直无法找到它。

因此,我的问题是:

如何调试RxJS/Angular?

>

我想也许项目$可观察引用被重新分配到某个地方,让模板订阅一个实际上没有得到新排放的可观察引用,所以我让@Input()成为一个每次都可以监控的getter/setter它被设定了,而且只发生一次。

我尝试将子组件更改为使用OnPush更改检测策略,但没有效果。

我被难倒了...

关于如何追踪我的问题有什么建议吗?

谢谢!:-)

共有1个答案

濮阳宁
2023-03-14

通过将{{items$|async | json}}放在父组件中靠近子组件的某个位置,确保可观察对象正在发射。您可能会发现items$没有发出值,如果是,则子项将得到更新。

您是否正在修改当前阵列并重新提交同一实例?修改数组时,请确保使用spread操作符、map或filer构建新数组,而不是推送和弹出值,然后让observable使用修改后的数据发射相同的数组实例。确保您发出一个新的数组实例,不要对旧的进行变异。

与您的问题无关,但我倾向于在OnChanges上使用setter属性

export class ChildComponent {
  items: Item[];
  @Input('items')
  set itemsSet(items: Item[]) {
    this.items = items;
    console.log('items set:', items.length);
  }
}
 类似资料:
  • tl;dr:ngOnChanges显示在输入属性上检测到更改,但视图未更新 我正在开发一个Angular(2+)应用程序,试图为一个异步任务创建一个进度条,该任务由一个服务使用可观察的。Observable将数字作为数据推送,以指示任务已完成的百分比。涉及三个部分:服务、ResultsComponent和ProgressBarComponent(ResultsComponent的子级)。基本数据流

  • 我有一个项目,使用角的$超文本传输协议服务从远程位置加载数据。我想使用rxjs的可观察性,所以我的服务中的调用看起来像这样: 这是我的控制器订阅的,如下所示: 问题是,尽管名称、电子邮件和个人资料图片正在更新,但这些更改不可见。一旦其他任何东西触发角$应用,更改就会出现,但由于可观察到,控制器中的这些更改发生在由$超文本传输协议调用触发的角摘要循环之后。如果我的服务只是向控制器返回一个promis

  • 问题内容: 我目前正在使用基于Web的Twitter客户端,因此我使用了angular.js,node.js和socket.io。我通过socket.io将新的推文推到我的客户端,服务在其中等待新的推文。当一条新的推文到来时,该服务通过$ broadcast发送事件。 在我的控制器中是一个事件侦听器,其中传入的tweet在单独的函数中进行处理。此功能只是将新的推文推入我的推文范围。 现在,我的问题

  • 有人能告诉我如何在计划的时间段内更新视图吗。例如,每秒钟。 我遇到的问题是,当我使用计时器时,它在不同的线程上运行,它不允许我更新视图并给出以下错误。 04-08 01:19:35.910:带dalvikvm(11040):线程ID=13:线程退出,但出现未捕获的异常(组=0x40a3e1f8)04-08 01:19:35.910:E/AndroidRuntime(11040):致命异常:线程13

  • 问题内容: 我正在AngularJS中构建仪表板系统,但遇到通过设置URL的问题 在我们的仪表板中,我们有一堆小部件。单击它们时,每个视图都会显示一个更大的最大化视图。我们正在尝试设置深层链接,以允许用户使用最大化的小部件链接到仪表板。 目前,我们有2条路线看起来像和 当用户最大化窗口小部件时,我们使用来更新url ,但这会导致视图重新呈现。由于我们拥有所有数据,因此我们不想重新加载整个视图,我们

  • 问题内容: 我有一个Angular SPA,它根据一些餐厅数据的不同部分提供了各种推荐列表和位置的Google Map(请参阅m.amsterdamfoodie.nl)。我希望每个列表都有自己的URL。为了让Google抓取不同的列表,我将标签用于offcanvas导航。 目前,标签会导致视图刷新,这在地图上非常明显。 我可以防止使用和(请参见下面的代码段),但是随后我需要实现一种更新浏览器URL