Angular2, doe's EventEmitter require zone.run?

Angular2, doe's EventEmitter require zone.run?

本文关键字:require EventEmitter zone run doe Angular2      更新时间:2023-09-26

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

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

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

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

问题是,我本以为自动change detection会在订阅回调执行时执行(完成后),但似乎根本没有更改检测执行,我必须用zone.run做一些类似click的事情——一个按钮或包装我的一些操作,我不确定这是有效的行为,还是我做错了什么。

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

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

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

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

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