angular - 如何根据路由参数指定调用方法?
问题描述
我的 Angular 应用程序中有一个ProfileComponent
,以及 2 个 JSON 文件 - employees.json
& managers.json
以前,我使用以下签入profile.component.ts
:
ngOnInit() {
this.route.paramMap.subscribe(params => {
const roleId = +params.get('role');
const empId = +params.get('id');
if (empId) {
if (roleId === 1) {
this.getEmployee(empId);
} else if (roleId === 2) {
this.getManager(empId);
}
}
});
}
HTML:
<td (click)="viewEmployeeProfile(1, employee.id)">{{employee.fullName}}</td>
<td (click)="viewEmployeeProfile(2, manager.id)">{{manager.fullName}}</td>
如果 roleId = 1,则显示来自 的数据employees.json
,如果 roleId = 2 则显示来自的数据managers.json
这是我的方法:
getEmployee(id: number) {
this.employeeService.getEmployee(id).subscribe(
(employee: IEmployee) => this.displayEmployee(employee),
(err: any) => console.log(err)
);
}
getManager(id: number) {
this.managerService.getManager(id).subscribe(
(manager: IManager) => this.displayManager(manager),
(err: any) => console.log(err)
);
}
以下是我的服务中的方法:
Employee Service
baseUrl = 'http://localhost:3000/employees';
getEmployee(id: number): Observable<IEmployee> {
return this.httpClient.get<IEmployee>(`${this.baseUrl}/${id}`)
.pipe(catchError(this.handleError));
}
Manager Service
baseUrl = 'http://localhost:3000/managers';
getManager(id: number): Observable<IManager> {
return this.httpClient.get<IManager>(`${this.baseUrl}/${id}`)
.pipe(catchError(this.handleError));
}
这以前是有效的,但我决定添加canActivate()
保护以阻止用户导航到具有无效 ID 的 Profile 组件。
这是我的路线:
{
path: 'profile/:role/:id', component: ProfileComponent,
canActivate: [RequireEmployeeProfileGuardGuard]
}
这就是我的警惕:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean | UrlTree> {
return this.employeeService.getEmployee(+route.paramMap.get('id')).pipe(
catchError(() => of(false)),
map(employee => !!employee || this.router.parseUrl('page-not-found'))
);
}
现在,当我搜索 Employee 时,该应用程序运行良好,因为它正在搜索employees.json
. 但是,如果我选择显示经理,它会失败,因为它正在搜索employees.json
经理的 ID。
有人可以指出我需要进行哪些更改以便我的代码搜索正确的文件吗?
解决方案
您可以canActivate
像在组件中所做的那样使用您的方法,如下所示:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean | UrlTree> {
const roleId = +route.paramMap.get('role');
const empId = +route.paramMap.get('id');
if(roleId === 1) {
//employee
return this.employeeService.getEmployee(empId)
.pipe(
map(employee => {
if(employee) {
return true;
} else {
this.router.parseUrl('page-not-found');
return false;
}
})
);
} else if(roleId === 2) {
//manager
return this.managerService.getManager(empId)
.pipe(
map(manager => {
if(manager) {
return true;
} else {
this.router.parseUrl('page-not-found');
return false;
}
})
);
} else {
//do not pass the guard
of(false);
}
}
为避免代码重复,您可以使用如下高阶函数:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean | UrlTree> {
const roleId = +route.paramMap.get('role');
const empId = +route.paramMap.get('id');
const myMap = map(emp => {
if(emp) {
return true;
} else {
this.router.parseUrl('page-not-found');
return false;
}
})
if(roleId === 1) {
return this.employeeService.getEmployee(empId)
.pipe(
myMap
);
} else if(roleId === 2) {
return this.managerService.getManager(empId)
.pipe(
myMap
);
} else {
//do not pass the guard
of(false);
}
}
推荐阅读
- javascript - 为什么函数中创建的属性和方法没有显示在该函数原型的构造函数属性中?
- git - EXPO SNACK:获取最新哈希时出错:无法获取存储库的最新提交哈希
- javascript - 如何纠正反应中的解析错误?
- mule - 使用 SOAP API 将联系人链接到客户
- java - 运行 jar 时的 ControlsFx 问题
- c# - WPF 在事件完成后设置属性
- nlp - 用于测量两个单词之间距离的 Jaccard 与余弦相似度(fasttext)
- google-cloud-platform - gcloud cli 命令在为某些帐户列出项目 ID 的资产时显示错误 INVALID_ARGUMENT
- logback - logback 配置中的条件 appender ref
- python - Django - 通过related_query_name 获取对象