Javascript Angular2,doe';s EventEmitter是否需要zone.run?
我使用的是ionic2,我实现了一个类:Javascript Angular2,doe';s EventEmitter是否需要zone.run?,javascript,angular,ionic2,Javascript,Angular,Ionic2,我使用的是ionic2,我实现了一个类: import {EventEmitter, Injectable} from 'angular2/core'; @Injectable() export class LocalPushClear extends EventEmitter<number> { constructor() { super(); } } 问题是,我希望订阅回调执行时(完成后)会执行自动更改检测,但似乎根本没有更改检测执行,我必须执行类似
import {EventEmitter, Injectable} from 'angular2/core';
@Injectable()
export class LocalPushClear extends EventEmitter<number> {
constructor() {
super();
}
}
问题是,我希望订阅回调执行时(完成后)会执行自动更改检测
,但似乎根本没有更改检测执行,我必须执行类似于单击按钮或使用区域包装我的某些操作。运行,我不确定这是否是一种有效的行为,或者我做错了什么
编辑:
我追踪代码并将其引向,因此它基本上是angular NgZone不知道的自定义事件发射器(至少我认为),但我确信,如果有人能证实,也许将来解释我会非常感激。你肯定应该而不是扩展EventEmitter
EventEmitter
仅应用于@Output()
s。只需使用主题
Angular不会收到有关EventEmitter
(以这种方式使用)或主题发出的值的通知。通常情况下,导致可观察的
(主题
)发出新值的代码由在完成时导致更改检测的代码执行,例如,当从事件处理程序或设置超时调用时
在您的情况下,原因似乎是使用LocalPushClear
发出新值的代码在Angulars区域之外运行
您可以使用中介绍的其中一种方法在可观察对象发出事件后触发更改检测。在我看来,您的某个操作操作了订阅了LocalPushClear
的同一组件中的某些属性,至少这是我提到更改检测问题时理解的。如果是这种情况,那么是的,它需要用区域包装Some Action。运行,因为更改请求来自组件域之外。@Hani首先,感谢您的评论,让我头疼的是我正在使用的EventEmitter
,从“angular/core”导出,我想当我订阅时,应该已经在实现它的代码中激活了变更检测,我正在寻找直接的答案,比如“从angular/core导出的EventEmitter不会自动运行变更检测”,或者可能是我做错了什么。谢谢,我将使用主题。
this._LocalPushClear.subscribe(data => {
// Some action is taken here
});