Angular2. Wie zum ausblenden(nicht darstellen) den link in das Menü nach dem check Zugang?
Verstecken muss link im Menü auf der Grundlage der "routerLink" nach dem check ACL-Zugriff. Ich will nicht zu verwenden, Winkel-Richtlinien "*ngIf" auf jedes element link in der app (Notwendigkeit zu tun, dass globaly auf die routerConfig-definition)
Inhalt kann kontrollieren mit annotation @CanActivate auf Komponenten, aber verstecken muss link im Menü
Ich versuche dies mit überschreiben "routerLink" Richtlinie, aber in diesen Richtlinien nach überschreiben bekomme keinen Zugriff auf meine erstreckt param definiert(Ressourcen und privilages) in der routerConfig
Beispiel:
@Component({})
@RouteConfig([{
path: '/dashboard',
name: 'Dashboard',
component: DashboardComponent,
data: {'resource':'account', 'privilage':'show'}
}])
Aber ich bekomme keinen Zugriff auf diese config-Daten(routerData) in der "routerLink".
Einige Idee, wie Sie das tun können?
Zweite version
Multi-level-Menü und trotzdem habe problem mit Zugriff auf die (Daten erweitern config) aus routerConfig definition.
Hauptbestandteil
@RouteConfig([
{ path:'/dashboard', name: 'DashboardLink', component: DashboardComponent, data: { res: 'dasboard', priv: 'show'}, useAsDefault: true },
{ path:'/user/...', name: 'UserLink', component: UserComponent, data: { res: 'user', priv: 'show'} },
])
@Component({
selector: 'main-app',
template: `
<ul class="left-menu">
<li><a secured [routerLink]="['UserLink']">User</a>
<ul>
<li><a secured [routerLink]="['ProfileLink']">Profile</a></li>
</ul>
</li>
<li><a secured [routerLink]="['HomeLink']">Home</a></li>
<li><a secured [routerLink]="['DashboardLink']">Dashboard</a></li>
</ul>
<router-outlet></router-outlet>
`
})
export class MainComponent {
}
Benutzer-Komponente
@RouteConfig([
{ path: '/profile', name: 'ProfileLink', component: ProfileComponent, data: {res: 'user', priv: 'details'} },
])
@Component({ ... })
export class UserComponent {
}
Profil Komponente
@Component({ ... })
export class ProfileComponent {
}
Meine sichere Richtlinien
@Directive({
selector: '[secured]'
})
export class SecuredDirective {
@Input('routerLink')
routeParams: any[];
/**
*
*/
constructor(private _viewContainer: ViewContainerRef, private _elementRef: ElementRef, private router:Router) {
}
ngAfterViewInit(){
//Get access to the directives element router instructions (with parent instructions)
let instruction = this.router.generate(this.routeParams);
//Find last child element od instruction - I thing thats my component but I am not sure (work good with two levels of menu)
this.getRouterChild(instruction);
}
private getRouterChild(obj: any){
var obj1 = obj;
while(true) {
if( typeof obj1.child !== 'undefined' && obj1.child !== null ){
obj1 = obj1.child;
} else {
break;
}
}
this.checkResPrivAcl(obj1.component.routeData.data)
}
private checkResPrivAcl(aclResAndPriv: any){
let hasAccess = CommonAclService.getInstance().hasAccess(aclResAndPriv['res'], aclResAndPriv['priv']);
if (!hasAccess) {
let el : HTMLElement = this._elementRef.nativeElement;
el.parentNode.removeChild(el);
}
console.log("CHECK ACL: " + aclResAndPriv['res'] + " | " + aclResAndPriv['priv']);
}
}
Diese Lösung funktioniert nur für ein Kind-Element des Menüs funktionieren nicht mit der Hauptebene des Menüs, und sich nicht sicher ist, diese Arbeit korrekt auf die multi-level-Menü.
Ich versuche verschiedene Wege um dieses problem zu beheben, versuche ich Zugriff auf die RouterConfig-definition (und meine routerData erweitern config) in den Richtlinien und check-element durch die alias-Namen der Verknüpfung mit @Input('routerLink') aber nicht finden, wie bekomme ich Zugriff auf die RouterConfig.
check access
?Ich meine, "überprüfen Sie den Zugriff", ob der Besucher berechtigt ist, eine link - Ressource definiert data: {'resource':'account', 'Privileg':'show'}
InformationsquelleAutor Power Web Design | 2016-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie könnte eine spezielle Richtlinie zu tun. Diese Richtlinie wäre aufstecken auf die gleiche HTML-element enthält, die
routerLink
. Auf diese Weise würden Sie haben Zugriff auf native element undRouterLink
Richtlinie:und verwenden Sie es auf diese Weise:
Basiert auf der
RouterLink
Richtlinie Beispiel, können Sie haben Zugriff auf die Daten, die Sie angegeben, wenn die Festlegung der route und verstecken das element, falls nötig:Sehen diese plunkr in der
src/app.ts
Bearbeiten
Wie vorgeschlagen in das Problem von Brandon, wir regenerieren konnten die component-Anweisung der Wert in der angegebenen
routerLink
Attribut:Ja, du hast definitiv Recht! Mit
@HostBinding
für die bessere Lösung 😉 ich aktualisierte meine Antwort und die plunkr entsprechend...Habe noch einige problem, bcs-2 bugs: - [die erste] der link nicht versteckt - [zweiter] Fehler TS2341: Eigenschaft '_navigationInstruction' privat ist und der Zugriff nur innerhalb der Klasse 'RouterLink' (weiß nicht, warum dieses Werk in plunker)
In der Tat, es ist, weil plunkr verwendet transpiling und keine Kompilierung, so können Sie rufen private Methoden, aber es ist nicht wirklich gut... Wenn Sie versuchen, Ihre Anwendung zu kompilieren, es ist normal, dass Fehler. In der Tat, ich denke, dass der beste Ansatz wäre, um eine patch-angular2 selbst. Auf diese Weise konnte Sie haben Zugang zu den
routeData
von derRouterLink
...irgendeine Idee, wie das umzusetzen, dieses in die neuesten eckige version?
InformationsquelleAutor Thierry Templier
wenn route aktiv wird, angular2 es standardmäßig fügt
.router-link-active
Klasse an den link.So, ich werde
hide
oderdisable
actived route,Danke für deine Antwort aber, ich will hide-link entfernen, wenn die Besucher auch nicht die ACL der Zugriff auf reasource (link). Kein verstecken aktiven link, wie u sagen.
InformationsquelleAutor micronyks