在 Angular routerLink 中使用查询字符串传递项目时如何序列化迭代器中的项目?

How to serialize an item from an iterator when passing it using query string in Angular routerLink?

我有一个迭代器,我的想法是创建一个子视图(用于版本、更流畅的显示等)。链接按预期工作,策略是在加载 sub.view 组件时获取数据的子集。由于法律和财务问题,我们更愿意提供已经加载的数据并从父视图而不是从 API.

提供子视图
<div *ngFor="let item of items">
  <a routerLink="{{'feature/subview/'}}"
     [queryParams]="{origin: ...,data:item}">Click me for {{item.name}}</a>
  {{item.this}} and {{item.that}} ...
</div>

我发现,虽然 item 值可用于超级组件并按预期呈现,但是当路由发生时,查询字符串包含文本 [Object object] 而不是它的实际序列化。如何强制序列化在查询字符串中传递的 item

或者,我是否应该使用查询字符串以外的其他方式传递数据?传递的数据总是很小,最多可能有 1000 个字符,通常低于 100 个字符,因此使用查询字符串是有意义的,但我对其他方法持开放态度,只要它不过分。

良好的编码标准需要分担责任。这肯定需要一个服务来处理数据的获取和设置。组件应该是哑的,应该只接受来自服务、输入或状态管理系统的数据。

撇开这些标准不谈,还有两种其他方法可以让您使用查询字符串并使其美观。使用 JSON.stringifyJSON.parse 方法获取和设置 queryParams。

<a routerLink="feature/subview" [queryParams]="getQueryParams(item)">
  Click me for {{item.name}}
</a>
getQueryParams(item): any {
  return { query: JSON.stringify({
    origin: ...,
    data:item
  }) };
}

然后您可以在您的其他组件中获取此查询:

constructor(private route: ActivatedRoute) {}

ngOnInit(): void {
  // ignoring possible obvious undefined errors
  const item = JSON.parse(this.route.snapshot.params.query).query;
}

另一种方法是使用 toString() 方法:

<a routerLink="feature/subview" [queryParams]="getQueryParams(item)">
  Click me for {{item.name}}
</a>
getQueryParams(item): any {
  return {
    origin: ...,
    data: item,
    toString() {
      return JSON.stringify(this)
    }
  };
}

我相信您不再需要使用 JSON.parse 作为您的快照,但我可能是错的

constructor(private route: ActivatedRoute) {}

ngOnInit(): void {
  const { origin, data } = this.route.snapshot.params;
}