【问题标题】:Observable.of(array) updates every time setInterval is fired每次触发 setInterval 时 Observable.of(array) 都会更新
【发布时间】:2018-05-07 21:30:10
【问题描述】:

在使用 Observable.of(array) 和 Angular 的异步管道时,我遇到了一些奇怪的行为。也许我用错了,但我无法理解。

我在 Ionic 3(角度 4)中有一个 view.html 和 view.ts 文件。我正在做一个 Observable.of(items)。 Items 只是一个包含对象的数组。在我看来,我有:异步的。这一切都很好,但是当我每 1000 毫秒在 view.ts 中执行一次 setInterval 时……视图每 1000 毫秒更新一次。即使 setInterval 什么都不做!

我用错了吗?我无法理解这种行为..!

【问题讨论】:

    标签: angular rxjs observable ionic3


    【解决方案1】:

    setInterval 方法以这样一种方式“修补”,即触发更改检测周期。

    查看here 了解更多信息。

    链接的一些相关部分:

    基本上,应用程序状态的变化可能是由三件事引起的:

    事件 - 点击、提交……

    XHR - 从远程服务器获取数据

    定时器 - setTimeout(), setInterval()

    它们都是异步的。这使我们得出的结论是, 基本上每当执行了一些异步操作时,我们的 应用程序状态可能已更改。这个时候有人需要 告诉 Angular 更新视图。

    谁通知 Angular?

    好的,我们现在知道导致应用程序状态变化的原因。但它说明了什么 Angular,在这个特定的时刻,视图必须更新? Angular 允许我们直接使用原生 API。没有 我们必须调用的拦截器方法,以便 Angular 得到更新通知 DOM。那是纯粹的魔法吗?如果您关注了我们的最新文章, 你知道 Zones 会处理这个问题。事实上,Angular 自带 自己的区域称为 NgZone,我们在文章 Zones 中对此进行了介绍 在角。你可能也想读一读。简短的版本是, 在 Angular 源代码的某个地方,有一个东西叫做 ApplicationRef,它监听 NgZones onTurnDone 事件。每当 这个事件被触发,它执行一个 tick() 函数,它本质上是 执行更改检测。

    【讨论】:

    • 感谢您的澄清!我现在知道行为来自哪里。不过仍在寻找解决方案..
    【解决方案2】:

    使用 OnPush 策略。使用此策略,仅评估受影响的项目,即触发事件或以其他方式标记为检查的组件。此外,项目以浅层模式进行比较,这意味着只检查引用。这要求您不要改变对象。

    从 @angular/core 导入 ChangeDetectionStrategy,然后将 changeDetection: ChangeDetectionStrategy.OnPush 添加到 @Component 装饰器。

    例如,使用 this.array = this.array.concat(value) 代替 this.array.push(value)

    当值异步更新时,例如在 http 调用或计时器中,添加 ChangeDetectorRef 并在回调中调用 markForCheck()

    【讨论】:

    • 这有帮助,但现在我的视图在将新对象推送到列表时不会更新。我在 @component 和 Observable.of() + async 管道上有 ChangeDetectionStrategy。
    • 不要推。 Concat 创建一个新数组。
    • 值是异步更新的,所以使用 markforcheck() 就可以了!谢谢!
    • 太棒了!但也不要变异,否则传递这些值的孩子不会更新。
    猜你喜欢
    • 2016-06-29
    • 2015-08-03
    • 2019-05-12
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多