【问题标题】:Angular performance using a service or properties and events使用服务或属性和事件的角度性能
【发布时间】:2020-05-27 13:47:54
【问题描述】:

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

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

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

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

那里有内存 cpu 权衡吗?

【问题讨论】:

  • 服务更简洁,可读性更强。您应该以限制对某些组件或模块的服务访问的方式构建项目,以防止完全不同的模块注入该服务。我不知道这与使用事件发射器之间的性能差异,但如果有的话,它们应该是最小的。

标签: angular property-binding


【解决方案1】:

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

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

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

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

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

我的建议:

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

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

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

【讨论】:

  • 我喜欢我的锤子,一切看起来都像钉子。我在服务中使用(可能过度)可观察对象和订阅来响应更改,而不是通过属性和事件进行原生 Angular 更改检测。结果是ngOnInit 在每个组件中都充满了订阅设置。当我开始在组件层次结构中使用属性和事件后,我发现很多事情才刚刚开始使用更少的代码。
【解决方案2】:

任何服务也可以限定为模块。 @Injectable() 指令的 providedIn 属性管理服务的范围。

您完全正确地了解了服务作为数据存储的内存含义。如果应用程序确实有很多数据,它可能会很明显。对于大多数,我会说几乎所有的应用程序没有大量的数据。用户不会注意到全局服务或组件属性之间的差异。

至于 CPU,我没有任何理由区分这两种情况下的 CPU 使用情况。只有数据存储的实现会影响 CPU 使用率。不管这家店在哪里。

【讨论】:

  • 我在我的应用程序中绘制了大量图表,因此确实有大量数据正在生成和传递。我在学习的早期就遇到了providedIn 属性,但从未真正找到它的用途。感谢您强调这一点。
猜你喜欢
  • 2018-03-14
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2014-12-08
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多