Angular 2事件发射器vs Subject

Ka *_*ech 51 angular

在Angular 2中,Event Emitter和Subject宣布活动有什么区别?似乎事件发射器的声明要简单得多...... Angular 2首选哪种方式?

dataRefreshEvent = new EventEmitter();

private companyDataAnnouncedSource = new Subject();
companyDataAnnouncedSource$ = this.companyDataAnnouncedSource.asObservable();
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 84

没有太大区别.EventEmitter延伸Subject.

Angular2团队强调了这一事实,但EventEmitter不应该用于@Output()组件和指令中的任何其他内容.

Angular团队表示,他们可能会更改EventEmitter用户代码的基础实现,并破坏用户代码的用途EventEmitter.这是主要的区别.

  • 谢谢你的澄清.我会坚持使用主题然后虽然看起来有很多额外的步骤来实现相同的结果.....很像很多角度2 (6认同)
  • 你对此有引用吗? (6认同)
  • 2018年仍然如此吗?(角5/6) (2认同)
  • @GünterZöchbauer感谢您的来源,我希望文档也有这些细节https://angular.io/api/core/EventEmitter再次感谢! (2认同)

小智 21

EventEmitter可以自动清理,而不像Subjects您需要在onDestroy生命周期钩子中取消订阅的自定义.

  • 你为什么这么说?请看这里:https://github.com/angular/angular/blob/183757daa28e575bd9ffb8ae6c31ebee7ff45443/packages/core/src/view/provider.ts#L142如果不详细说明,任何可观察的内容都将被跟踪和取消订阅. (5认同)
  • 这是EventEmitter最重要的部分,也是它存在的原因 (3认同)
  • 这个答案不正确,请阅读 https://stackblitz.com/edit/angular-emitter-vs-subject 示例。 (3认同)
  • 47 票赞成的答案是错误的。文档中没有关于生命周期差异的内容:https://angular.io/api/core/EventEmitter (3认同)
  • “EventEmitter 会自动清理”是不正确的。我自己测试过,它不会“自动清理”。如果您不手动取消订阅,则会出现内存泄漏。两者都必须手动取消订阅!答案必须删除。 (2认同)

Nik*_*dav 13

EventEmitterSubjects服务于相同的目的 - 向观察者通知事件。

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

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


小智 5

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

  • 不确定你是对的 https://stackblitz.com/edit/angular-bpcmue 两者都是同步的 (2认同)
  • 对于后来遇到这个问题的人来说,主题是同步的。EventEmitter 默认是同步的,但可以在构造函数中传递一个标志以使其异步运行。 (2认同)