如何在Angular 11中的不相关组件之间进行通信?

如何在Angular 11中的不相关组件之间进行通信?,angular,Angular,我已经搜索过了,看到了一些使用NgRx的例子,但我不想在我正在工作的这个小项目上使用它。我希望有一个更简单的方法 目标 我试图在单击组件a时更新组件b。我使用的是Angular 11,组件之间没有相互引用。如果有必要的话,我也会使用有角度的材料 代码 单击ProjectComponent上的技能芯片时,我想更新SkillComponent上的过滤器,以过滤表格以显示该技能 你想要实现的是状态管理。正如您所提到的,您确实可以使用库来获得一个可扩展且功能强大的解决方案,但是为了保持简单,一个服务

我已经搜索过了,看到了一些使用NgRx的例子,但我不想在我正在工作的这个小项目上使用它。我希望有一个更简单的方法

目标 我试图在单击组件a时更新组件b。我使用的是Angular 11,组件之间没有相互引用。如果有必要的话,我也会使用有角度的材料

代码

单击ProjectComponent上的技能芯片时,我想更新SkillComponent上的过滤器,以过滤表格以显示该技能



你想要实现的是状态管理。正如您所提到的,您确实可以使用库来获得一个可扩展且功能强大的解决方案,但是为了保持简单,一个服务就足够了。 以下是您可以遵循的步骤:

  • 创建服务过滤器服务
  • 在服务属性中添加公共可观察的currentSearch$
  • 在与搜索词交互的每个组件中注入FilterService
  • 每次搜索词更改时,在FilterService中调用一个方法,该方法将触发您的observable中的事件
  • 每次单击一个芯片时,也要调用FilterService中的一个方法(它可以是相同的,也可以是不同的,取决于您的架构选择)
  • 在需要使用术语更新的每个组件中,订阅currentSearch$并相应地更新行为
  • 更新

    根据您提供的代码,问题出在服务的setCurrentSearch方法中。在这一行:

    this.currentSearch$ = new BehaviorSubject(searchTerm.trim().toLowerCase());
    
    您正在将BehavorSubject(您的组件已经订阅了该主题)替换为一个新主题(没有组件正在侦听)。要更新搜索词,必须保持BehaviorSubject的完整性,并且只更新其值。这是这样做的:

    this.currentSearch$.next(searchTerm.trim().toLowerCase())
    

    你想要实现的是状态管理。正如您所提到的,您确实可以使用库来获得一个可扩展且功能强大的解决方案,但是为了保持简单,一个服务就足够了。 以下是您可以遵循的步骤:

  • 创建服务过滤器服务
  • 在服务属性中添加公共可观察的currentSearch$
  • 在与搜索词交互的每个组件中注入FilterService
  • 每次搜索词更改时,在FilterService中调用一个方法,该方法将触发您的observable中的事件
  • 每次单击一个芯片时,也要调用FilterService中的一个方法(它可以是相同的,也可以是不同的,取决于您的架构选择)
  • 在需要使用术语更新的每个组件中,订阅currentSearch$并相应地更新行为
  • 更新

    根据您提供的代码,问题出在服务的setCurrentSearch方法中。在这一行:

    this.currentSearch$ = new BehaviorSubject(searchTerm.trim().toLowerCase());
    
    您正在将BehavorSubject(您的组件已经订阅了该主题)替换为一个新主题(没有组件正在侦听)。要更新搜索词,必须保持BehaviorSubject的完整性,并且只更新其值。这是这样做的:

    this.currentSearch$.next(searchTerm.trim().toLowerCase())
    

    谢谢你的回答。如果对我有用的话,我会尝试一下并接受答案。你忘了提到在组件之间使用Subject或Behavior Subject进行数据共享。实际上,我通常将观察作为一个通用术语来讨论。BehaviorSubject和Subject是Observable的子类。我在实现它时遇到了一些问题。我更新了我的问题,加入了我尝试过的代码,但它不起作用。如果您能提供此实现的示例,将非常有用。我对Angular不太熟悉…我只是编辑了我的答案,回答了你的第二个问题。谢谢你的回答。如果对我有用的话,我会尝试一下并接受答案。你忘了提到在组件之间使用Subject或Behavior Subject进行数据共享。实际上,我通常将观察作为一个通用术语来讨论。BehaviorSubject和Subject是Observable的子类。我在实现它时遇到了一些问题。我更新了我的问题,加入了我尝试过的代码,但它不起作用。如果您能提供此实现的示例,将非常有用。我对Angular不太熟悉…我只是编辑了我的答案,回答了你的第二个问题。