当 angular 可以检测到最新值时,为什么要在服务中使用 Subject 或 BehaviorSubject?

问题描述

例如,我们有一个服务,其中包含一个项目列表。 当我们在服务中更改此列表时,所有使用此列表的组件都会检测到此更改。例如,如果您添加一个新项目,所有组件都会检测到它。 那么当 angular 本身可以检测到变化时,我们为什么要使用 subject 或 BehaviorSubject 呢?

解决方法

更改检测是在数据更改后更新 DOM 的好方法。但是如果你想做更多的事情呢?如果组件需要通过执行一些代码来对更改做出反应怎么办?

如果更改在组件树中向下流动,您可以通过利用 @Input 来实现。但是,如果您需要侧向、向上或独立于树的形状进行通信,该怎么办?受限于单向数据流,角度变化检测对此无能为力,因此您需要一种不同的方式来传播变化。这就是 Observables 的用途。

,

使用 Subject/BehaviourSubject 创建服务的模式主要用于在缺乏直接连接的组件之间传递数据。 对于直接连接,我的意思是两个没有任何关系的组件,例如父/子、兄弟姐妹、孙子。

假设您有两个组件需要在没有这种直接连接的情况下共享数据,您将如何在这些组件之间传递数据(因为您不能使用 Input()Output() + EventEmitter,ViewChild(),ViewChildren()) ?一个组件如何知道另一个组件属性何时发生更改?

出于这个原因,我们创建了一个具有主题/行为 Subject 的服务(从现在开始将简称为主题)。 需要使用最新发布更新的每个组件都会将此服务和 subscribe() 注入主题。 这样当我们在 next()Subject 一个值时,订阅 Subject 的每个组件都将获得最新的发射。当 Subject 发射时,您可以运行一些逻辑(例如,将发射分配给组件属性或使用该发射作为参数运行一些组件方法)。

仅当组件有直接连接时,您的问题才是合法的:

为什么在 angular 可以的情况下在服务中使用 Subject 或 BehaviorSubject 检测最新值?

在这种情况下,仅使用 @Input()@Output() + EventEmitter 在组件之间传递数据并没有错。但是您可能仍然希望实现 service + Subject 模式,例如,如果父组件需要与其孙辈共享数据。当一个嵌套非常深时,您可能希望避免在两个组件之间传递数据。您必须使用 @Input()@Output() + EventEmitter 跟踪整个组件链,次数与嵌套组件的数量一样多。在这种情况下,您可能只需使用服务 + Subject 以获得更清晰的最终结果。

,

你可以使用 Subject、BehaviorSubject、EventEmitter 或任何你想达到目标的东西。谁让你完全使用主题或行为主题? 如果你询问 ChangeDetectionStrategy - 你混淆了概念,你应该参加 Angular 的课程,因为 ChangeDetectionStrategy 是关于组件中的输入(@Input() something: string)及其变化