【问题标题】:How to hide link by guard angular2如何通过guard angular2隐藏链接
【发布时间】:2017-03-23 06:27:14
【问题描述】:

如何在视图 html 中隐藏管理链接。我要守护 :Admin 和 Manager

路由器配置:

{
   path: 'manager',
   component: ManagerComponent,
   canActivate: [ManagerGuard]
},
{
   path: 'user',
   component: UserAdminComponent,
   canActivate: [AdminGuard]
}

在视图中:

 <li>
    <a routerLink="/user" routerLinkActive="active-link">User</a>
 </li>

我想在 /user 上为 ManagerGuard 隐藏链接,但为 AdminGuard 显示。

【问题讨论】:

    标签: angular2-routing


    【解决方案1】:

    在我看来,这与路由器本身无关。

    您的 Guards 可能会调用另一个服务,该服务具有有关登录的用户类型的信息:管理员或经理。

    您应该创建一个知道用户类型的服务。然后将这个带有Dependency Injection 的服务注入到您拥有routerLink 的组件中。

    您可以在此处询问服务并使用*ngIf切换链接:

    <li *ngIf="myService.getCurrentUser().isAdmin()">
        <a routerLink="/user" routerLinkActive="active-link">User</a>
    </li>
    

    因此,该服务提供了一个函数,该函数为您提供当前登录的用户,并且用户的isAdmin()-函数返回truefalse。如果用户是管理员,则&lt;li&gt; 将显示,否则将被隐藏。

    这只是一个例子,但我希望你明白这一点。它更多地与 Angular 2 的基本功能有关,而不是 Angular 2 的路由器。有关*ngIf 的更多信息可以找到here

    【讨论】:

    • 我同意使用服务内部的逻辑而不是 Guard 是有意义的。 Guard 应该保护组件免受未经授权的访问。它可能包括一些其他功能,例如导航到访问被拒绝的页面。
    【解决方案2】:

    此外,如果已经以可能有用的方式回答,我在这里使用了另一种方法。由于您已经在 Guard 中拥有 canActivate 方法,因此您还可以使用该 Guard 注入导航组件,您可以直接调用这些 canActivate 方法:

    在包含导航的组件中

    constructor(private adminGuard: AdminGuard)
    

    然后在模板中

    <li *ngIf="adminGuard.canActivate()">
      <a routerLink="/user" routerLinkActive="active-link">User</a>
    </li>
    

    编辑

    在我的情况下,这在 prod 模式下不起作用(如果您使用必须注入的参数)。我只是试图编译它,但角度抱怨缺少参数。如果您不使用参数,这可以正常工作,或者,如果您不使用函数中的参数 - 那么只需传递

    <li *ngIf="adminGuard.canActivate(null,null)">
      <a routerLink="/user" routerLinkActive="active-link">User</a>
    </li>
    

    另外一件事:如果你在模板中是像上面的'adminGuard'这样的变量,它必须是公共的——而不是私有的。

    【讨论】:

    • 这是一个很好的解决方案。如果您的 canActivate 方法使用参数怎么办?例如canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnapshot)。如何将指定的路由参数放入模板中?
    • 我刚刚被那个绊倒了。如果您尝试在 prod 模式下构建您的应用程序,它会抱怨那些缺少的参数。我会检查是否有可能实现这个目标。
    • 我最终编写了自己的自定义指令,它基本上取代了您的 *ngIf。当我使用参数时,我无法直接调用它 - 所以我必须在需要应用权限的任何地方复制逻辑,例如*showForRoles="[UserTypes.Admin, UserTypes.SuperUser]"
    • 这里的功能请求:github.com/angular/angular/issues/25342 我认为很多人都会重定向到守卫,这会导致事情无法按预期工作。这里的解决方案是正确的,但是可以将其他参数添加到警卫中(就像我在功能请求中显示的那样)以允许它与重定向一起使用。
    猜你喜欢
    • 2017-02-04
    • 1970-01-01
    • 2012-02-11
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多