如何在Angular中的路由组件之间传递数据

Posted

技术标签:

【中文标题】如何在Angular中的路由组件之间传递数据【英文标题】:How to pass data between routed components in Angular 【发布时间】:2021-09-12 09:30:13 【问题描述】:

我有一个这样的路由组件:

从组件 A:我有一个通过 API 获取的对象,目前我有一个按钮将我重定向到组件 B。

组件A和B之间没有父子关系。

我想做的是在重定向到组件 B 的同时发送该对象,这样我就可以处理它了。

我不想像这样通过 URL 传递数据

 return this.router.navigate(['associate-product/' + this.id, this.data]);

另外我不想将对象存储在 LocalStorage 上。

有没有办法做到这一点?

【问题讨论】:

当您说“组件 A 和 B 之间没有父子关系”时。你的意思是你不使用服务?如果你不使用它,是因为你没有听说过还是因为你真的不想要? 没听说过,有没有服务可以做到这一点? 服务是一个 ts 文件,由使用相同变量/方法的某些组件使用。该文件允许您通过在组件中注入服务来共享数据。 我怎样才能注入服务?我有一个服务会调用组件 A 上的 api,我有一个函数可以在组件 B 上构造我需要的对象,我该如何发送它? 【参考方案1】:

使用路由

如果您想使用路由将数据从一个组件传递到另一个组件,您可以使用NavigationExtras

在 CompA 你可以这样做:

constructor(private router: Router)


goToCompB()
  this.router.navigate(['associate-product/' + this.id], 
    state:
      data: yourDataToShareWithCompB
    
  );

在 CompB 中你可以这样做:

constructor(private router: Router)
 const data = router.getCurrentNavigation().extras.state.data;

PS:您也可以使用其他人回答的基于服务的模式

【讨论】:

【参考方案2】:

您可以使用具有主题/行为的服务来实现这一点,如他们的docs 中所述

【讨论】:

【参考方案3】:

使用服务,您可以通过注入服务的组件共享数据。

我创建了一个stackblitz,其中包含一个共享数据的可能性的小例子,并知道何时从 API 检索数据。

在此示例中,您有 2 个组件 A 和 B,以及一个服务“示例”。

在您的第一个组件 (A) 上,您调用 API 来获取数据,在示例中,我创建了一个 seTimeout 来模拟异步调用。

然后,当调用完成时,可以显示一个移动到 b 的按钮,并且在组件 b 上有从超时检索到的数据。

【讨论】:

以上是关于如何在Angular中的路由组件之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

Angular2:通过路由器在兄弟组件之间传递数据?

路由之间的角度传递数据

如果组件不是Angular2中的父子组件,如何在组件之间传递数据?

如何在Angular 8中未调用的组件之间传递数据[重复]

Angular 8:通过本地服务在单独模块中的组件之间传递数据

如何将 Angular 5 中的点击数据从父组件传递到子组件?