2017-01-26 4 views
2

sind neu in angular2 und ich habe eine Sidebar, Ich mag würdeÜberprüfung von Berechtigungen in angular2

Benutzerberechtigungen zeigen und verstecken basierend auf

Das ist, was ich

<ul class="sidebar-menu"> 
    <li class="header">MAIN NAVIGATION</li> 

    <li [hidden] = "canAccess('dashboard')"> 
    <a routerLinkActive="active" routerLink="/dashboard"> 
     <i class="fa fa-dashboard"></i> 
     <span>Dashboard</span> 
    </a> 
    </li> 
</ul> 

Dann in der Dashboard-Komponente getan habe

canAccess(permission:string){ 
return this._dashboardService.canUser(permission) 
    .subscribe(res=>{ 
    return res 
    }, 
    err=>{ 
     return false; 
    } 

) 

}

Dann wird die _dashboardservice

//http client attaches the access token stored in local storage 

    canUser(permission:string):Observable<boolean>{ //returns true or fals 
    return this._httpclient.post(this.url,permission) 
    .map(this.extractData) 

} 

Das geht über zu einer Endlosschleife der HTTP-Post

immer Ausführung Was ich

+0

oben Programm in Endlosschleife, weil es die Überprüfung hält Wert geändert wird oder nicht. Dies ist ein Merkmal von Winkel 2, um die Änderungserkennung zu überprüfen. Also benutze keine Funktion in [hidden] oder * ngIf. Statt dessen können Sie eine Funktion in ngOnInit() Ihrer Komponente aufrufen. und speichern Sie seine Antwort in einem booleschen und diesem booleschen Wert, den Sie im HTML-Teil verwenden können, indem Sie entweder * ngIf oder [hidden] verwenden. Wenn Sie möchten, kann ich Antwort mit etwas Code hinzufügen, um diesen Prozess zu erklären. –

Antwort

2

Verwenden Sie zuerst *ngIf anstelle von [hidden] in den Listenelementen.

Nun zu dem wichtigen Teil Ihres Codes in Endlosschleife. Die Sichtbarkeit der Liste ist Sichtbarkeit ist an canAccess() Funktion gebunden, die eine Observable zurückgibt. Es sollte auf eine Variable oder Funktion oder Betrieb, die einen boolean oder einen Wert zurückgibt gebunden, die für truthy/falsy getestet werden kann.

Do etwas wie folgt aus:

<ul class="sidebar-menu"> 
    <li class="header">MAIN NAVIGATION</li> 
    <li [*ngIf] = "showDashboard"> 
     <a routerLinkActive="active" routerLink="/dashboard"> 
      <i class="fa fa-dashboard"></i> 
      <span>Dashboard</span> 
     </a> 
    </li> 
</ul> 

Und der Code für die Komponente sollte die folgenden Angaben enthalten:

private showDashboard: boolean = false; 

// Call this function appropriately on component init 
canAccess (permission:string) { 

    return this._dashboardService 
     .canUser(permission) 
     .subscribe(res => { 
      this.showDashboard = true; 
     }, 
     err => { 
      this.showDashboard = false; 
     } 
    ) 
} 
+0

Ich habe mehr als 20 Berechtigungen zu überprüfen, bedeutet 20 Variablen –

+0

In Ihrem Service-Aufruf können Sie alle Berechtigungen als ein Objekt (jede Eigenschaft, die eine Berechtigung darstellt) erhalten. Dann benutze es in deiner HTML-Vorlage als '* ngIf =" permissions.dashboard "', '* ngIf =" permissions.another_section "usw. –

1

Angular fehlen könnte erkennt die Änderungen und jedes Mal etwas geändert wird es die HTML-umbaut.

Dies ist die Zeile aus Ihrer Vorlage:

<li [hidden] = "canAccess('dashboard')"> 

das ist, nachdem er ausgeführt wird und das Ergebnis vom Server zurückkommt, Winkel zwingt zu prüfen, ob sich etwas verändert wurde; Angular wiederholt die Komponente erneut und ruft natürlich den Server erneut an.

Denken Sie nur an das Ergebnis in Ihrer Komponentenvariable, füllen Sie diese Variable in ngOnInit und verwenden Sie die Variable, nicht die Funktion.

+0

Ich habe mehr als 20 Berechtigungen zu überprüfen, bedeutet es, dass ich die 20 Variablen erstellen muss, um in init –

+0

einen Backend-Endpunkt zu erstellen, der alle zurückgibt und es als ein Objekt/Array speichert? Oder machen 20 Anfragen und speichern sie in einem Objekt/Array? – smnbbrv

+0

@GEOFFREYMWANGI tatsächlich gibt Ihre Funktion derzeit eine 'Observable' und nicht' boolean' => es ist immer 'true' – smnbbrv

Verwandte Themen