angularjs要解决的路线

时间:2017-12-20 02:03:24

标签: javascript angularjs angular-ui-router

我的应用中有大量的angularjs路线。我想根据一些用户权限级别设置对这些路由的访问权限。

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

这是我的路线之一:

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

所以这段代码有效,但如果我想添加这个:

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

到每条路线,它都会是重复的代码,或者如果我想查找其他角色,那就太无聊了。 我们能否让解决部分更小更清洁?

3 个答案:

答案 0 :(得分:1)

在这样的路线之上的配置函数中创建一个变量

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

并在每条路线中使用它,

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

答案 1 :(得分:0)

您可以创建一个服务/工厂,它共享$ rootScope.specialRights。只需在路由的第一个解析中初始化服务中的$ rootScope.specialRights,例如

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

在那里你需要它

  YourServiceOrFactory.getSpecialRights()

它不必在其他结果中,只需在您的路径控制器或指令/组件中。比多个resovles更清洁和更好的表现。

答案 2 :(得分:0)

由于您已经在$rootScope中设置了此属性,因此在所有路由中使用resolve是一种过分的做法,只是为了获取变量值,当然,{{ 1}}不是为此目的而设计的。

相反,只需在控制器中注入resolve,然后在控制器中使用$rootScope

示例:

在您的控制器,服务,指令或组件中,您可以像这样注入$rootScope.specialRights

$rootScope