angular - Kontrollera behörigheter i angular2


Jag är ny på Angular2 och jag har en sidopanel som jag vill visa och dölja baserat på användarbehörigheter

Detta är vad jag har gjort

 <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>

Sedan i instrumentpanelens komponent

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

  )

}

Sedan _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)

 }

Ovanstående går in i en oändlig loop som alltid utför HTTP-post

Vad skulle jag kunna missa

Svar #1

För det första, använd *ngIf istället för [hidden] i listobjekten.

Nu till den viktiga delen av din kod som hamnar i en oändlig loop. Listobjektets synlighet är bunden till canAccess()-funktionen som returnerar en Observable. Den bör vara bunden till en variabel eller funktion eller operation som returnerar en boolean eller ett värde som kan testas för sant/falskt.

Gör något liknande detta:

<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>

Och koden för komponenten ska inkludera följande:

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;
        }
    )
}

Svar #2

Angular upptäcker ändringarna och varje gång något ändras bygger det om HTML-koden.

Detta är raden från din mall:

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

vilket är, efter att det har körts och resultatet kommer tillbaka från servern, tvingar Angular att kontrollera om något har ändrats; Angular renderar om komponenten igen och självklart anropar servern igen.

Kom bara ihåg resultatet i din komponentvariabel, fyll i denna variabel i ngOnInit och använd variabeln, inte funktionen.