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

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

dataRefreshEvent = new EventEmitter();

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

【问题讨论】:

  • 在完全学习了 Rxjs 之后,我意识到 EventEmitters 可以做很多事情。

标签: angular


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不确定你是对的stackblitz.com/edit/angular-bpcmue两者都是同步的
    • 对于以后遇到此问题的任何人,主题是同步的。 EventEmitter 默认是同步的,但是可以在构造函数中传递一个标志让它异步运行。
    • 如果对异步运行订阅逻辑感兴趣; stackoverflow.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 不同。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2017-02-27
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多