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 不知道的自定义事件发射器(至少我认为),但我敢肯定,如果有人可以确认,也许未来解释我会很感激。
你绝对应该不扩展EventEmitter
。 EventEmitter
只应该用于 @Output()
s。只需使用 Subject
即可。
Angular 不会收到有关 EventEmitter
(以这种方式使用时)或 Subject
发出的值的通知。通常,导致 Observable
(Subject
) 发出新值的代码由在完成时导致更改检测的代码执行,例如当从事件处理程序或 setTimeout
调用时。
在您的情况下,原因似乎是使用 LocalPushClear
发出新值的代码在 Angulars 区域之外运行。
您可以使用 中说明的方法之一在 Observable
发出事件后触发更改检测。
我正在使用 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 不知道的自定义事件发射器(至少我认为),但我敢肯定,如果有人可以确认,也许未来解释我会很感激。
你绝对应该不扩展EventEmitter
。 EventEmitter
只应该用于 @Output()
s。只需使用 Subject
即可。
Angular 不会收到有关 EventEmitter
(以这种方式使用时)或 Subject
发出的值的通知。通常,导致 Observable
(Subject
) 发出新值的代码由在完成时导致更改检测的代码执行,例如当从事件处理程序或 setTimeout
调用时。
在您的情况下,原因似乎是使用 LocalPushClear
发出新值的代码在 Angulars 区域之外运行。
您可以使用 Observable
发出事件后触发更改检测。