【问题标题】:How to pass object between components when switching between routes Angular在路由Angular之间切换时如何在组件之间传递对象
【发布时间】:2019-04-04 13:21:37
【问题描述】:

我有一个看起来像这样的组件

<div class="animal">
  <a routerLink="/animal/{{animal.id}}">
  <div>
    ...
  </div>
  </a>
</div>

它从父组件获取animal 对象,这只是一个子组件列表。

@Input() animal;

当我点击它时,我正在移动到另一个组件,我想在其中显示这个点击的animal 对象的一些属性。

我想创建一个服务来存储这个对象,但问题是我不知道如何只获取单击的对象而不是列表中的每个对象。

我们将不胜感激。

【问题讨论】:

标签: angular angular-routing angular-routerlink


【解决方案1】:

尝试使用 resolver Route Resolver Service - 您可以在路由加载之前执行一些操作

 {
    path: '',
    component: Component,
    resolve: { service: Service },
  },

export class Service implements Resolve<object | string> {

  constructor() {
    }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<object | string> | Promise<object | string>  {
        return {};
    }

在您的 onInit 中,您可以像这样在组件构造函数中注入 ActivatedRoute 服务来读取数据

constructor(private _activatedRoute: ActivatedRoute) {
    }

Onint 中的代码 - this.variable = this._activatedRoute.snapshot.data["service"];

【讨论】:

    【解决方案2】:

    您可以通过在angular 中使用ActivatedRoute 来捕获路由组件中的参数

    你的路由路径:

    const routes : Routes = [
      { 
        // Other routes
      },
      {
         path:'animal/:id'
         component : AnimalDetailsComponent
      }
    ]
    

    animal-details.component.ts

    constructor(private route : ActivatedRoute) {} 
    
    ngOnInit(){
      this.route.params.subscribe((params)=>{
         console.log(params['id'])
      })
    }
    

    【讨论】:

    • 是的,但这样我得到一个 id 而不是整个对象
    • 如果你想发送整个对象,你可以在service的帮助下使用EventEmitterSubjectBehaviorSubject。您还可以使用SessionStoragelocalStorage 进行组件之间的通信。
    • 嗯,我找到了这个解决方案stackoverflow.com/a/39569933/5206428,但如果我在/animal/:id 上刷新路由,它就会停止工作
    • SessionStorage 和 LocalStorage 不会有这样的问题
    猜你喜欢
    • 2021-09-12
    • 2019-12-07
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多