2017-04-18 4 views
2

ich die templateUrl auf den Router-Anbietern ändern möchte auf der Basis der Benutzerberechtigung wie folgt aus:Änderung templateUrl in routeProvider basierend auf Benutzerberechtigung

$routeProvider 
    .when('/',{ 
    if(user) 
     templateUrl:'app/views/pages/home-page.html' 
    else if(admin) 
     templateUrl:'app/views/pages/admin-page.html' 
    }) 

Ich habe eine Abfrage, die die Berechtigung des Benutzers zu mir zurück , wenn der Benutzer admin ist, sollte ich ihn zur Admin-Homepage weiterleiten? Was ist die beste Vorgehensweise, um dies zu tun?

Antwort

1

Sie können dies erreichen eine routeChange Ereignis mit (können Sie diesen Code auf Ihre app.run hinzufügen):

In Ihrem app.run:

$rootScope.$on("$routeChangeStart", function(event, next, current) { 
    if(next.$$route.originalPath = '/' && user) { 
     $location.path('/home'); 
    }   
}); 
+0

Ich habe dies verwendet und habe den folgenden Fehler TypeError: Kann die Eigenschaft 'originalPath' von undefined nicht? –

+1

@MahmoudAbdALKareem 'next' ist die nächste Route (wohin Sie gehen). Versuchen Sie, dieses Objekt zu überprüfen, um zu sehen, was passiert – Mistalis

1

templateUrl akzeptiert eine Funktion als Wert für dynamische Routing-Werte.

Aus der Dokumentation:

"If templateUrl is a function, it will be called with the following parameters:

{Array.} - route parameters extracted from the current $location.path() by applying the current route"

Sie entweder diese Funktion nutzen zu können Ihre if-Anweisung Logik, benimmt sich wie Middleware ausführen, oder eine Funktion anwenden, die die Logik der Fall ist, baut Ihre dynamische Vorlage und gibt es zurück.

$routeProvider 
.when('/', { 
    templateUrl: _ => { //you're not using a dynamic file name here 
     let route = 'app/views/pages/'; 
     if (user) route += 'home-page.html'; 
     else if (admin) route += 'admin-page.html'; 
     return route; 
    } 
}) 

Sie können diesen einen Schritt weiter gehen und den Parameter anwenden, der eine Abhängigkeit zu Ihrer URL hinzufügt. Jetzt wird sich die Middleware ändern, da beide den gleichen Wert akzeptieren. Sie müssen also die Funktion ändern, um die Berechtigungen für beide Ebenen zu überprüfen, oder unterschiedliche URL-Bereiche anwenden.

Beispiel mit $http. Offensichtlich kenne ich Ihr ganzes Schema nicht, um .isUser, isAdmin und url/for/permissions als Dinge zu nehmen, die Sie ändern müssen.

$http.get('/url/for/permissions/').then(results => { 
    $routeProvider 
    .when('/', { 
     templateUrl: _ => { //you're not using a dynamic file name here 
      let route = 'app/views/pages/'; 
      if (results.isUser) route += 'home-page.html'; 
      else if (results.isAdmin) route += 'admin-page.html'; 
      return route; 
     } 
    }) 
}); 
+0

kann ich eine HTTP-Anforderung innerhalb dieses machen Funktion um die Erlaubnis zu bekommen? –

+0

Ja, aber da es async ist, möchten Sie vielleicht nach Berechtigungen suchen, bevor der routeProvider ausgeführt wird –

+0

Großartig! Können Sie die Antwort mit einem Beispiel aktualisieren? –

Verwandte Themen