Passing dynamic data through Angular 2 route
可以将静态数据传递给 Angular 2 路由而不在 URL 上显示。
但是我怎样才能以同样的方式传递动态数据/对象呢?
您可以使用解析器。解析器返回的数据可用于路由,与路由配置上的静态
示例见 https://angular.io/guide/router#resolve-guard
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 @Injectable()
export class CrisisDetailResolve implements Resolve<Crisis> {
constructor(private cs: CrisisService, private router: Router) {}
resolve(route: ActivatedRouteSnapshot): Promise<Crisis>|boolean {
let id = route.params['id'];
return this.cs.getCrisis(id).then(crisis => {
if (crisis) {
return crisis;
} else { // id not found
this.router.navigate(['/crisis-center']);
return false;
}
});
}
}
1
2
3
4
5
6
7
8
9
10
11 path: '',
component: CrisisListComponent,
children: [
{
path: ':id',
component: CrisisDetailComponent,
canDeactivate: [CanDeactivateGuard],
resolve: {
crisis: CrisisDetailResolve
}
},
1
2
3
4
5
6
7 ngOnInit() {
this.route.data
.subscribe((data: { crisis: Crisis }) => {
this.editName = data.crisis.name;
this.crisis = data.crisis;
});
}
最好结合前面两个答案:
-
G??nter Z??chbauer 的答案包括一个自定义解析器,它是一个消息丰富器:给定一个以
/crisis/15 结尾的 URL,它将把危机的完整数据传递给 CrisisComponent。我们需要解析器,但我认为 OP 不希望在 URL 中显示任何数据。 - Tsadkan Yitbarek 的回答提出了一种用于数据存储和通信的服务(类似于 Redux/Flux 中的 Store)。他正确地认为这是矫枉过正,但我??们需要将信息存储在某个地方。
因此解决方案是将共享数据放入解析器本身:与组件不同,服务是长期存在的,并且始终只有一个实例,因此解析器中的数据是安全的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // --- CrisisDetailResolve --- // In the function body, add: private currentCrisisId: number | string set(crisisId: number | string) { this.currentCrisisId = crisisId } // change line 5 of CrisisDetailResolve: let id: number = 0 + this.currentCrisisId // -- In your code -- // You can now navigate while hiding // the crisis number from the user: private click(crisisId : string | number) { // tell resolver about the upcoming crisis: this.crisisResolve.set(crisisId) // navigate to CrisisDetail, via CrisisResolve: this.router.navigate(['/crisisDetail') // CrisisDetail can now receive id and name in its NgOnInit via `data`, // as in G??nter Z??chbauer's answer and the Angular docs } |
参见关于路由的 Angular 文档
你可以做两件事
1.不推荐但使用数据作为路由器参数并通过,
1 | { path: 'some:data', component: SomeComonent } |
并用作
1 2 | let data = {"key":"value"} this.router.navigate(['/some', data) |
2.而不是通过路由参数传递数据(因为数据可能很大并且容易受到攻击,因为它可以被用户查看)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Injectable() export class SomeService { data = {}; } @Component({... providers: [SomeService] export class Parent { constructor(private someService:SomeService) {} private click() { this.someService.data = {"key":"value"} } } |
您可以使用状态对象从Angular7.2传递动态数据
在组件中使用 navigateByUrl
发送任何数据
1 2 3 4 | public product = { id:'1', name:"Angular"}; gotoDynamic() { this.router.navigateByUrl('/dynamic', { state: this.product }); } |
并使用 history.state
读取它
1 2 3 4 5 | In dynamicComponent ngOnInit() { this.product=history.state; } |
参考:
传递动态数据