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】:EventEmitter
和 Subjects
具有相同的目的 - 向观察者通知事件。
但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事件发射器与主题的主要内容,如果未能解决你的问题,请参考以下文章