首页 > 解决方案 > 使用服务或属性和事件的角度性能

问题描述

文档提到了组件交互的几种方式:

https://angular.io/guide/component-interaction

使用服务而不是属性/事件是否有性能优势,或者相反?

我还是 Angular 的新手,并且一直在使用服务在组件之间共享数据,但我觉得这会使数据“全球化”,这样任何组件都可以在允许的情况下读取或写入服务。我正在考虑切换到属性/事件作为强制数据范围的一种方式,并尝试限制全局使用数据的服务(如日志或其他真正需要通用访问的数据)。

那里有内存<-> cpu 权衡吗?

标签: angularproperty-binding

解决方案


一般来说,原则上,两者的目的不同。

当您需要“做某事”时使用服务,例如与 REST API 通信、缓存数据或任何其他可服务接口下的内容,可以重用并绑定到应用程序的生命周期。

另一方面,事件旨在“响应”事物。例如,当点击事件发生时,需要触发和处理回调,其生命周期与应用程序的生命周期无关,而是与事件及其回调的生命周期相关。

当然,没有理由不能将两者混合使用(例如,如果您的服务是“反应式”的,那么在服务中使用 EventEmitter<>/RX 观察者就非常好;例如,当它正在侦听 websocket 连接并且需要通知 1-N 个订阅者),但一般设计原则应该是在有意义的地方使用服务/事件。

此外,正如您所提到的,服务是全局的(在上下文/模块内),而事件和属性通常是本地化的。出于这个原因,最好在全局交互有意义的地方使用服务(例如共享基础设施),并在应该本地化的地方使用事件/属性。

我的建议:

在需要执行缓存、需要执行外部通信(websocket/webapi)或需要在多个组件/服务/层之间共享通用功能时使用服务。

使用事件和属性的唯一目的是在 2 个(或更多,如果链接的)组件之间共享数据,因为它们通常更干净用于此目的(组件的接口将准确地指示它输入和输出的内容)。

您要避免的是创建太多“服务”,这些“服务”仅充当组件之间的通信网关,其中事件/属性(输入和输出)更有意义。


推荐阅读