Angular2,doe的EventEmitter需要zone.run?

时间:2016-05-02 22:22:34

标签: javascript angular ionic2

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

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

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

LocalPushClear

问题在于,我期望在订阅回调执行时执行自动this._LocalPushClear.subscribe(data => { // Some action is taken here }); (当它完成时),但似乎根本没有更改检测执行,我必须做类似{ {1}}按钮或将我的 某些操作 包裹在change detection,我不确定它是否是有效的行为,或者我是不是做错了。

修改 我跟踪代码并导致Subject,因此它基本上是自定义事件发射器,角度NgZone不知道(至少我认为),但我确定,如果有人可以确认,也许未来的解释我会非常感激。

1 个答案:

答案 0 :(得分:2)

你绝对应该扩展EventEmitterEventEmitter仅应用于@Output()。只需使用Subject代替。

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

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

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