如何获得@CanActivate的结果?

时间:2016-02-22 16:07:37

标签: angular angular2-routing

是否可以从父路径或根路由获取子路由@CanActivate的值?

我有几条不同@CanActivate条件的路线。它们在应用程序初始化后工作,但我的问题是初始加载。当我打开一个浏览器时,路径指向一条无法激活的路径:

@CanActivate(() => false)

组件未加载,这很好。在这种情况下我想重定向到root,但我找不到好的条件来检查。我尝试了几件事:

    父组件上的
  • useAsDefault: true - 无效
  • 私有this._router._currentInstruction - 没有效果,null@CanActivate(() => false)对子组件@CanActivate(() => false)
  • 在父/根组件上的
  • routerOnActivate() - 没有效果,它永远不会在子组件上使用@CanActivate(() => false)调用

更新

尝试使用Reflect,但它接缝路由器不会引用实际组件,但会创建componentType“副本”:

  ngAfterViewInit() {
    let url = this._router.lastNavigationAttempt;
    this._router.recognize(url).then(resolvedInstruction => {
      let component = resolvedInstruction.child.component.componentType;
      let canActivate = Reflect.getMetadata("CanActivate", component.constructor);
      console.log(canActivate); // => undefined
    });

1 个答案:

答案 0 :(得分:1)

我通过在前一个linkParamsComponentInstruction时创建null来解决此问题,然后指示路由器使用这些参数进行导航。

这是一个有点复杂的解决方案(使用@ ngrx / store,静态类方法,注入器...),但它是大型应用程序的一部分,我喜欢一次性写入而忘记它< / em>方法(:

然而,它易于使用:

@CanActivate((next, prev) => {
  return _BaseRoute.canActivate(true, next, prev );
})
export class ChildRoute extends _BaseRoute { 
  constructor(public store: Store<any>) {
    super();
  }
}

其余代码位于this Gist。如果有人找到更好的解决方案,我很乐意接受答案。