javascript - Angular2,doe 的 EventEmitter 需要 zone.run?

标签 javascript angular ionic2

我正在使用 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
});

问题是,我期望在订阅回调执行时(完成时)执行自动变更检测,但似乎根本没有变更检测执行,我必须做一些像点击一个按钮或者用zone.run包裹我的Some action,我不确定是否这是一个有效的行为,或者我做错了什么。

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

最佳答案

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

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

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

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

关于javascript - Angular2,doe 的 EventEmitter 需要 zone.run?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36992560/

相关文章:

javascript - 使用greasemonkey预加载页面

javascript - 如何在 Dancer 中找到数据文件的路径以在 Javascript 中使用?

javascript - 我如何将点击事件定位到 Angular 2 中的另一个组件

android - Ionic 2 Android 工具栏按钮正在堆叠

javascript - 将 jquery 'this' 和 'next' 更改为特定元素

javascript - 如何使用动态参数在 javascript 中创建 anchor 链接?

angular - 如何将项目附加到 Observable

Angular 2 使用 FormBuilder 访问嵌套的 FormArrays

javascript - 变量在 Ionic 中定义

javascript - 是否可以在 Ionic2/Angular2 应用程序中使用 HTTPS/SSL?