2017-12-20 5 views
0

Ich habe eine große Anzahl von angularjs Routen in meiner App. Ich möchte den Zugriff auf diese Route basierend auf einigen Benutzerberechtigungsstufen einrichten.angularjs Route zu lösen

angular.module('myApp').run(['$rootScope', 'someAuthFactory', function($rootScope, someAuthFactory) { 
$rootScope.$on('$stateChangeStart', function (event, toState) { 
      $rootScope.permissions = someAuthFactory.getPermssionLevels(); 
      $rootScope.specialRights = $rootScope.permissions.indexOf('superRole') > -1; 
... 

und hier ist eine meiner Routen:

.state("dashboard.overview", { 
    url: "/dashboard", 
    templateUrl: "app/dashboard.html", 
    resolve: { 
     roles: ['rootScope', function (rootScope) { 
      return $rootScope.specialRights;}] 
     }, 

sodass dieser Code funktioniert, aber wenn ich das hinzufügen möchten:

resolve: { 
     roles: ['rootScope', function (rootScope) { 
      return $rootScope.specialRights;}] 
     } 

auf jeder Strecke, es ist gonna be Doppelter Code, oder wenn ich eine andere Rolle suchen will, wird es langweilig. Könnten wir die Auflösung Teil viel kleiner und viel sauberer machen?

Antwort

0

Sie können einen Service/Factory erstellen, der $ rootScope.specialRights freigibt. Just in $ rootScope.specialRights im Dienst in der ersten Lösung Ihrer Route z.

.state("dashboard", { 
    url: ... 
    templateUrl: ... 
    resolve: { 
     roles: ['rootScope', function (rootScope) { 
       YourServiceOrFactory.setSpecialRights($rootScope.specialRights); 
       return $rootScope.specialRights 
    }] 
}, 

Und dort, wo Sie sie brauchen

YourServiceOrFactory.getSpecialRights() 

Es nicht in anderen Entschlüssen sein muss, nur in Ihrem Controller Ihrer Route oder in der Richtlinie/Komponente. Viel sauberer und leistungsfähiger als mehrere resovles.

1

eine Variable in Config-Funktion auf der Routen wie diese

var resolveRoles = ['rootScope', function (rootScope) { 
    return $rootScope.specialRights;}] 
} 

erstellen und es in jeder Route wie folgt verwenden,

.state("dashboard.overview", { 
     url: "/dashboard", 
     templateUrl: "app/dashboard.html", 
     resolve: { 
      roles: resolveRoles 
     }, 
    }); 
0

Da Sie bereits diese Eigenschaft in $rootScope Einstellung Es ist ein Overkill, resolve in all Ihren Routen zu verwenden, nur um einen variablen Wert zu erhalten, und natürlich ist resolve nicht für solche Zwecke ausgelegt.

Stattdessen injizieren Sie einfach die $rootScope in Ihrem Controller und $rootScope.specialRights in der Steuerung verwenden.

Beispiel:

In Ihrem Controller, Service, eine Richtlinie oder eine Komponente, können Sie die $rootScope wie diese injizieren:

angular.module('your_module') 
    .controller('your_controller', ['$rootScope', function($rootScope) { 
    // Access $rootScope.permissions or $rootScope.specialRights here 
    }]; 
+0

können Sie ein Beispiel geben? – Bonnard

+0

@Bonnard - siehe meine aktualisierte Antwort. – 31piy