【问题标题】:Angular2, doe's EventEmitter require zone.run?Angular2,doe 的 EventEmitter 需要 zone.run 吗?
【发布时间】:2016-05-02 22:22:34
【问题描述】:

我正在使用ionic2,我实现了一个类:

import {EventEmitter, Injectable} from 'angular2/core';
@Injectable()
export class LocalPushClear extends EventEmitter<number> {
    constructor() {
      super();
    }
}

我的一个组件使用该类将cordova plugin event 连接到另一个订阅LocalPushClear 的组件,我监听clear 事件,它触发的事件,我使用LocalPushClear 发出的事件和其他一些订阅的组件:

this._LocalPushClear.subscribe(data => {
    // Some action is taken here
});

问题是,我希望在订阅回调执行时自动执行change detection(完成后),但似乎根本没有执行更改检测,我必须做类似click一个按钮或用zone.run 包裹我的Some action,我不确定它是否有效,或者我做错了什么。

编辑: 我跟踪代码,它导致Subject,所以它基本上是角度 NgZone 不知道的自定义事件发射器(至少我认为),但我敢肯定,如果有人能证实,也许未来我会解释非常感谢。

【问题讨论】:

  • 在我看来,您的 Some Action 操纵了已订阅LocalPushClear 的同一组件中的某些属性,至少这是我从提及更改检测问题时所理解的。如果是这种情况,那么是的,需要将 Some Action 包装为 zone.run,因为更改请求来自组件域之外。
  • @Hani 首先,感谢您的评论,让我烦恼的是我正在使用的 EventEmitter,它是从 'angular/core' 导出的,我认为当我订阅时应该已经是实现它的代码中的更改检测激活,我正在寻找直接答案,例如“您从 angular/core 导出的 EventEmitter 不会自动运行更改检测”,或者我做错了什么。跨度>

标签: javascript angular ionic2


【解决方案1】:

你绝对应该扩展EventEmitterEventEmitter 应该只用于@Output()s。只需改用Subject

Angular 不会收到有关EventEmitter(以这种方式使用时)或Subject 发出的值的通知。通常,导致Observable (Subject) 发出新值的代码由在完成时导致更改检测的代码执行,例如从事件处理程序或setTimeout 调用时。

在您的情况下,原因似乎是使用 LocalPushClear 发出新值的代码在 Angulars 区域之外运行。

您可以使用https://stackoverflow.com/a/34829089/217408 中介绍的方法之一在Observable 发出事件后触发更改检测。

【讨论】:

  • 谢谢,我会用Subject
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多