Angular2, doe's EventEmitter require zone.run?
Angular2, doe's EventEmitter require zone.run?
我使用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不知道(至少我认为),但我相信,如果有人能证实,也许未来会解释,我会非常感谢。
您绝对应该而不是扩展EventEmitter
。EventEmitter
应该只用于@Output()
s。只需使用Subject
即可。
Angular不会收到关于EventEmitter
(当以这种方式使用时)或Subject
发出的值的通知。通常,使Observable
(Subject
)发出新值的代码由在完成时(例如从事件处理程序或setTimeout
调用时)引起更改检测的代码执行。
在您的案例中,原因似乎是使用LocalPushClear
发出新值的代码在Angulars区域之外运行。
您可以使用中介绍的方法之一https://stackoverflow.com/a/34829089/217408以在CCD_ 17发出事件之后触发变化检测。
相关文章:
- 当使用extern和目标JavaScript时,我如何强制Haxe编译器使用require语句
- 在gump和nodejs中使用Typescript时,未定义对require和exports的引用
- Typescript导入导出的类会发出require(..),从而导致浏览器错误
- 将require('..')与变量一起使用与在webpack中使用字符串相比
- 限制npm依赖模块's require(隔离)的用法
- 可以't扩展EventEmitter
- 如何在不使用require语句的情况下使用webpack加载目录中的所有文件
- 无法加载Ace.js编辑器模式和主题(命名空间项目&AMD require.js&grunt
- 在javascript中的require中传递变量
- "检测到可能的EventEmitter内存泄漏”;使用Gulp+Watchify+Factor捆绑包
- 避免重新评估和动态卸载用“require”调用的对象
- 可以'I don’我不明白;使用webpack和es6模块进行EventEmitter
- 弹出窗口-jQuery Mobile、Backbone.js和Require.js
- 在非SPA(单页应用程序)中使用Require.js和Backbone
- Angular2, doe's EventEmitter require zone.run?
- 在混合基本 URL 下动态加载 require.js 模块
- Node.js”;检测到EventEmitter内存泄漏”;
- require('babel/register')不'不起作用
- Require in nodejs
- require(events) === events.EventEmitter