2017-04-27 60 views
0

给出了这样一个模板角2 - 如何让

<a *ngIf="canAccess()" routerLink="/adminUsers">...</a> 
<a *ngIf="canAccess()" routerLink="/link2">...</a> 
<a *ngIf="canAccess()" routerLink="/otherlink">...</a> 
<a *ngIf="canAccess()" routerLink="/somthingelse">...</a> 

和功能ngIf功能标签属性:

canAccess() 
{ 
    ... 

我如何才能

  • 路由器链路
  • 该功能内的任何其他标签属性

感谢

+1

通过**标签属性**您指的是什么? – Aravind

回答

0

我的解决方案是创建一个指令和它相关的组件,所以我只给它的用户想要访问

模块

如果用户登录并且可以访问该链接,该指令询问服务

如果是,该链接remplaced与组件

这里是如何插入组件dynamicaly(不包含授权部分)

import { Directive, Input, ComponentFactoryResolver,ViewContainerRef } from '@angular/core'; 
import { MenuItemComponent } from './menuItem.component'; 

@Directive({ selector: '[menuItem]' }) 
export class MenuItemDirective { 

    constructor(
     private componentFactoryResolver: ComponentFactoryResolver, 
     private viewContainer: ViewContainerRef) {} 

    @Input() set menuItem(_link: string) { 
     if(some sort of condition depending on a auth service) 
     { 
      const factory = this.componentFactoryResolver.resolveComponentFactory(MenuItemComponent); 
      const menuItemComponentRef = this.viewContainer.createComponent(factory); 
      menuItemComponentRef.changeDetectorRef.detectChanges(); 
     } 
     else 
      this.viewContainer.clear(); 
    } 
} 

可能是矫枉过正个例,但最终我用

<a *menuItem="dashBoard"></a> 

代替

<a class="menuItemA menuRouterLinkA" routerLink="/dashBoard" routerLinkActive="menuCurrentLinkA" >{{ "DashBoard" }}</a> 

,它涉及无线th功能/页面/模块..访问授权:-)

yay

0

您可能需要:

把你需要的那些放到构造函数中,并在你的canAccess()中调用它们的方法。

此外,您可以使用Guard保护您的路线(从routerLink)本身。

+0

但我有很多链接,我只给了一个作为例子(我更新了我的模板) – ninja

+0

因此,为了使用Guards,你需要将它们添加到你的'app.routes.ts'(或任何你拥有它们的地方)。 – fuma

+0

确实不错,我会检查这一点,谢谢 – ninja

1

更新您的模板

<a *ngIf="canAccess($event)" routerLink="/adminUsers">...</a> 

和你的组件

canAccess(event){ 

    console.log(event.currentTarget); 
    console.log(event.currentTarget.getAttribute("routerlink")); 
    .. 
    } 
+0

您只需通过'canAccess()'方法检查'event.currentTarget.getAttribute('routerlink')'方法如果/开关/ array.includes /无论并返回相应的布尔值。 – fuma

+0

哦,我不知道我可以通过点击这样的事件,确实不错,谢谢 – ninja

+0

您的欢迎,但是您需要关心'currentTarget'在某些浏览器中不起作用。在这种情况下,它可能是'srcElement'或'target' – Jerry06