首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得“CanActivate”的结果?

如何获得“CanActivate”的结果?
EN

Stack Overflow用户
提问于 2016-02-22 16:07:36
回答 1查看 361关注 0票数 2

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

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

代码语言:javascript
复制
@CanActivate(() => false)

组件没有加载,这很好。在这种情况下,我想重定向到根,但是我找不到好的条件来检查。我尝试过的东西很少:

  • 父组件上的useAsDefault: true -没有影响
  • 私有this._router._currentInstruction -没有效果,对于子组件的@CanActivate(() => false)@CanActivate(() => false)都是null
  • 父/根组件上的routerOnActivate() --没有效果,它从未与子组件上的@CanActivate(() => false)一起调用

更新:

即使在Reflect中也尝试过,但是它的接缝路由器不引用实际组件,而是创建componentType“副本”:

代码语言:javascript
复制
  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
    });
EN

回答 1

Stack Overflow用户

发布于 2016-02-22 19:25:52

我解决了这个问题,在以前的linkParamsnull的情况下创建了null,然后指示路由器使用这些params导航。

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

然而,它很容易使用:

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

其余代码在这个要旨中。如果有人找到更好的解决办法,我很乐意接受这个答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35558346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档