Angular 2事件发射器与主题

Posted

技术标签:

【中文标题】Angular 2事件发射器与主题【英文标题】:Angular 2 Event emitters vs Subject 【发布时间】:2017-03-07 10:03:28 【问题描述】:

在 Angular 2 中,用于宣布事件的事件发射器和主题有什么区别?似乎事件发射器的声明不那么复杂......Angular 2 首选哪种方式?

dataRefreshEvent = new EventEmitter();

private companyDataAnnouncedSource = new Subject();
companyDataAnnouncedSource$ = this.companyDataAnnouncedSource.asObservable();

【问题讨论】:

在完全学习了 Rxjs 之后,我意识到 EventEmitters 可以做很多事情。 【参考方案1】:

EventEmitterSubjects 具有相同的目的 - 向观察者通知事件。

EventEmitter 只能用于将事件从子级通知给父级,即它只能与@Output() 一起使用。

要通知跨不同组件的事件,应该首选Subjects。主题从一个组件发出值,任何其他组件都可以订阅它,它会收到通知。

【讨论】:

【参考方案2】:

EventEmitter 默认是同步的,而 Subject 不是。 您可以将标志传递给 EventEmitter 以使其异步。

【讨论】:

不确定你是对的stackblitz.com/edit/angular-bpcmue两者都是同步的 对于以后遇到此问题的任何人,主题是同步的。 EventEmitter 默认是同步的,但是可以在构造函数中传递一个标志让它异步运行。 如果对异步运行订阅逻辑感兴趣; ***.com/a/45223232/9947918(想编辑最后一条评论,但不让我。)【参考方案3】:

没有太大区别。 EventEmitter 扩展了 Subject

尽管如此,Angular2 团队强调了一个事实,即 EventEmitter 不应该用于其他任何东西,而不是 @Output()s 在组件和指令中。

Angular 团队 has stated 表示,他们可能会更改 EventEmitter 的底层实现,并破坏使用 EventEmitter 的用户代码以实现其不适合的用途。这是主要区别。

【讨论】:

感谢您的澄清。然后我会坚持使用主题,尽管似乎需要很多额外的步骤才能达到相同的结果.....就像使用 angular 2 的很多 你对此有引用吗? Misko 在 cmets to Github issues 中提到过。我没有链接。 2018年还是这样吗? (角度 5/6) @GünterZöchbauer 谢谢你的来源,我希望文档也有这些细节angular.io/api/core/EventEmitter再次感谢!【参考方案4】:

此外,EventEmitter 会自动清理,这与您需要在 onDestroy 生命周期挂钩中取消订阅的自定义 Subjects 不同。

【讨论】:

这是 EventEmitter 最重要的部分,也是它存在的原因 为什么要这么说?看这里:github.com/angular/angular/blob/… 无需详细说明,任何可观察的内容都将被跟踪和取消订阅。 这个答案不正确,请阅读stackblitz.com/edit/angular-emitter-vs-subject示例。

以上是关于Angular 2事件发射器与主题的主要内容,如果未能解决你的问题,请参考以下文章

Angular2事件发射器没有得到处理

Angular2自定义表单控件防止发射事件

Angular 组件中的 SSE 发射器传递错误

如何使一个公共事件总线在单个spa中交互两个angular4 / 5应用程序

Angular @Output 不起作用

angular 2+ 使用 createComponent 工厂时如何使用和监听输出发射器