mar*_*ria 5 javascript routes resolver angular
我正在寻找一种使用一条角度路线的方法来解决要在所有路线上使用的问题,但是要使用不同的参数:
目前,我有类似的东西:
{
path: 'user/:any',
component: UserprofileComponent,
resolve: { ProfiledUser: UserprofileResolver }
},
Run Code Online (Sandbox Code Playgroud)
profileuser解决:
resolve(route: ActivatedRouteSnapshot) {
return this.GlobalService.Get('/userprofile/admin');
}
Run Code Online (Sandbox Code Playgroud)
我实际上正在为解析器本身寻找一种使用Get函数使用的参数的方法GlobalService。
我以前做了一些理论上可行的事情:
path: 'family/panel',
component: FamilyCoreComponent,
canActivate: [PermissionGuardService],
data: {roles: [0]},
Run Code Online (Sandbox Code Playgroud)
在哪里可以激活权限保护:
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean>|boolean {
var requirementRole = next.data.roles[0];
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我应该像对权限保护员那样使用解析器的原理吗?
例如:
{
path: 'user/:any',
component: UserprofileComponent,
resolve: { ProfiledUser: UserprofileResolver }
data: {load: 'userprofile/admin'},
},
Run Code Online (Sandbox Code Playgroud)
这会是一个好方法吗?如果是这样,我将如何使其变得最高效?
很好的问题,也让我摸不着头脑:)。
那么让我们深入研究我对这个问题的解决方案。
使用时,Resolver我们可以用我们喜欢的任何东西(函数/类)替换解析器。
@NgModule({
imports: [
RouterModule.forRoot([
{
path: 'team/:id',
component: TeamComponent,
resolve: {
team: 'teamResolver'
}
}
])
],
providers: [
{
provide: 'teamResolver',
useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => 'team'
}
]
})
Run Code Online (Sandbox Code Playgroud)
该片段直接来自 ng文档
因此,在您的情况下,您可以在该useValue行中添加一些额外的参数,如下所示
useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) =>
new ResolverWithParamsResolver(
route,
state,
"customLink"
).resolve()
Run Code Online (Sandbox Code Playgroud)
你ResolverWithParamsResolver可能有类似下面的代码片段
export interface ResolverWithParamModel<T> {
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
linkParam: string
): Observable<T> | Promise<T> | T;
}
// Custom resolver
@Injectable()
export class ResolverWithParamsResolver implements ResolverWithParamModel<any> {
constructor(
private route: ActivatedRouteSnapshot,
private state: RouterStateSnapshot,
private linkParam: string
) {}
resolve(): Observable<any> | Promise<any> | any {
return of(this.linkParam)
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在您将可以访问您的linkParam.
这是一个演示,它比答案中的片段复杂一点,它实现了所需的效果。
如果自定义解析器有 10 到 15 个可能的不同配置,我可能会创建 10-15 个解析器,因为乍一看会更容易理解每个解析器的作用。
不确定这是否是最好的解决方案,但我认为这些内容正是您想要的,如果您在实施时遇到任何问题,请创建一个 stackblitz/codesandbox/plunker 演示,我会尽力帮助您:)