Angular 将解析数据传递给子路由
Angular pass resolve data to child-routes
我有以下组件结构
- 项目
- 编辑项目
- 子资源1
- 子资源2
- 子资源3
所以我的路由是这样的:
const childroutes = [
{
path: '',
children: [
{ path: 'edit', component: EditProjectComponent},
{ path: 'subres1', component: Subres1Component},
{ path: 'subres2', component: Subres2Component},
{ path: 'subres3', component: Subres3Component},
{ path: 'subres4', component: Subres4Component}
]
}
]
{
path: 'project/:projectId',
component: ProjectDetailComponent,
children: childroutes,
resolve: { project: ProjectResolver} /** resolve Project from ProjectService **/
}
如您所见,我从服务中解析了我的 Projectdata,并可以通过
在 ProjectDetailComponent 中访问它们
this.route.snapshot.data
所以现在的问题是,如何将 "EditProjectComponent" 中解析的数据传递给它的所有子路由组件?
我现在可以执行以下操作来解析子组件中的项目数据:
const childroutes = [
{
path: '',
children: [
{ path: 'edit', component: EditProjectComponent,resolve: { project: ProjectResolver}},
{ path: 'subres1', component: Subres1Component,resolve: { project: ProjectResolver}},
{ path: 'subres2', component: Subres2Component,resolve: { project: ProjectResolver}},
{ path: 'subres3', component: Subres3Component,resolve: { project: ProjectResolver}},
{ path: 'subres4', component: Subres4Component,resolve: { project: ProjectResolver}}
]
}
]
但这看起来很丑陋而且是错误的。
这里有两个选择:
1. 您可以通过子解析器访问父解析数据,方法是创建一个 child-specific 解析器并访问路由的父 属性.
[...module.ts | ...component.ts]
{
path: 'project/:projectId',
component: ProjectDetailComponent,
resolve: { project: ProjectResolver }
children: [
{
path: ':projectId/edit',
component: EditProjectComponent,
resolve: { edit: EditProjectResolve }
}
]
}
edit-project-component.ts
ngOnInit() {
this.edit = this.route.snapshot.data.edit;
}
2. 您可以一起绕过子组件的解析器,并从子组件中访问父数据。
[...module.ts | ...component.ts]
{
path: 'project/:projectId',
component: ProjectDetailComponent,
resolve: { project: ProjectResolver }
children: [
{
path: ':projectId/edit',
component: EditProjectComponent
}
]
}
edit-project-component.ts
ngOnInit() {
this.route.parent.data
.subscribe((data) => {
this.edit = data.edit;
});
}
您只需要在子组件中执行此操作:
ngOnInit() {
this.route.parent.data
.subscribe((data) => {
this.edit = data.edit;
});
}
我有以下组件结构
- 项目
- 编辑项目
- 子资源1
- 子资源2
- 子资源3
所以我的路由是这样的:
const childroutes = [
{
path: '',
children: [
{ path: 'edit', component: EditProjectComponent},
{ path: 'subres1', component: Subres1Component},
{ path: 'subres2', component: Subres2Component},
{ path: 'subres3', component: Subres3Component},
{ path: 'subres4', component: Subres4Component}
]
}
]
{
path: 'project/:projectId',
component: ProjectDetailComponent,
children: childroutes,
resolve: { project: ProjectResolver} /** resolve Project from ProjectService **/
}
如您所见,我从服务中解析了我的 Projectdata,并可以通过
在 ProjectDetailComponent 中访问它们this.route.snapshot.data
所以现在的问题是,如何将 "EditProjectComponent" 中解析的数据传递给它的所有子路由组件?
我现在可以执行以下操作来解析子组件中的项目数据:
const childroutes = [
{
path: '',
children: [
{ path: 'edit', component: EditProjectComponent,resolve: { project: ProjectResolver}},
{ path: 'subres1', component: Subres1Component,resolve: { project: ProjectResolver}},
{ path: 'subres2', component: Subres2Component,resolve: { project: ProjectResolver}},
{ path: 'subres3', component: Subres3Component,resolve: { project: ProjectResolver}},
{ path: 'subres4', component: Subres4Component,resolve: { project: ProjectResolver}}
]
}
]
但这看起来很丑陋而且是错误的。
这里有两个选择:
1. 您可以通过子解析器访问父解析数据,方法是创建一个 child-specific 解析器并访问路由的父 属性.
[...module.ts | ...component.ts]
{
path: 'project/:projectId',
component: ProjectDetailComponent,
resolve: { project: ProjectResolver }
children: [
{
path: ':projectId/edit',
component: EditProjectComponent,
resolve: { edit: EditProjectResolve }
}
]
}
edit-project-component.ts
ngOnInit() {
this.edit = this.route.snapshot.data.edit;
}
2. 您可以一起绕过子组件的解析器,并从子组件中访问父数据。
[...module.ts | ...component.ts]
{
path: 'project/:projectId',
component: ProjectDetailComponent,
resolve: { project: ProjectResolver }
children: [
{
path: ':projectId/edit',
component: EditProjectComponent
}
]
}
edit-project-component.ts
ngOnInit() {
this.route.parent.data
.subscribe((data) => {
this.edit = data.edit;
});
}
您只需要在子组件中执行此操作:
ngOnInit() {
this.route.parent.data
.subscribe((data) => {
this.edit = data.edit;
});
}