我正在使用 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 会解释我会非常感激。
最佳答案
您绝对不应该扩展EventEmitter
。 EventEmitter
只能用于 @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/