Angular2,doe 的 EventEmitter 需要 zone.run?

Angular2, doe's EventEmitter require zone.run?

我正在使用 ionic2,我实现了 class:

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

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

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

问题是,我期待在订阅回调执行时自动执行 change detection(当它完成时),但似乎根本没有变化检测执行,我必须做点什么比如 click 一个按钮,或者用 zone.run 包裹我的 一些动作 ,我不确定它是否是一个有效的行为或者我做错了什么。

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

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

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

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

您可以使用 中说明的方法之一在 Observable 发出事件后触发更改检测。