现在我正在使用angular2 rc.4。但在不久的将来,我会将我的应用更新到rc.6。
我的任务是确定活动路由,我想在后台按用户角色/类型/任何方式实现路由保护。
我的应用程序对所有用户开放,另一个应用程序是后台。
后台的一些路线:
{
path: "proposal",
component: ProposalCmp,
data: {
authList: [
ROLES_DATA.ADMIN,
]
}
},
{
path: "proposal/:id",
component: ProposalCmp,
data: {
authList: [
ROLES_DATA.ADMIN,
ROLES_DATA.CUSTOMER
]
}
},
在应用程序初始化阶段,路由由authList
角色过滤,以防止在动态菜单上显示所有链接。如果某种类型的用户不应该看到它,它就不会显示,并且工作正常。
但是在第一次加载(重新加载页面)时,我遇到了一些问题。例如,如果我以customer
身份登录,则只能查看proposal/:id
,proposal
。
所以我决定写路线卫士:
@Injectable()
export class RouteGuard implements CanActivate {
constructor(private tokenService: TokenService,
private router: Router,
private activatedRoute: ActivatedRoute) {
}
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
// this.router.isActive(url=string|UrlTree, exact=true)
// released in rc.5 - https://github.com/angular/angular/blob/2.0.0-rc.5/modules/%40angular/router/src/router.ts#L328
console.log(state.url, this.router.url);
return true;
}
}
最后,在第一页加载(重新加载页面)时,我只能从state.url
获取正确的网址,route
对象似乎默认值初始化,route.data
为空route.url
。
如果已加载应用并激活其他路线,例如,点击链接,我会在route.data
方法中获得正确的canActive()
。
好吧,我可以导入所有路由的数组并通过它们,但是我如何解析路径路径proposal/:id
并将其与proposal/6
进行比较,我可以从{{1}获取}}?我还没有使用过它很好,但如果我愿意的话。我现在可以使用正则表达式,但我不认为这是未来的好选择。
我发现了类似的问题 - Angular 2 routes current url with params
问题是:
state.url
或其他订阅不起作用。ActivatedRoute.url.subscribe()
中的proposal/6
与我的路径state.url
进行比较?