【问题标题】:angularjs route to resolveangularjs路由解决
【发布时间】:2017-12-22 12:00:26
【问题描述】:

我的应用中有大量 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;}]
        }

到每条路线,都会有重复的代码,或者如果我想查找其他角色,那会很无聊。 我们能否让 resolve 部分更小更清晰?

【问题讨论】:

    标签: javascript angularjs angular-ui-router


    【解决方案1】:

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

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

    并像这样在每条路线中使用它,

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

    【讨论】:

      【解决方案2】:

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

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

      在你需要的地方

        YourServiceOrFactory.getSpecialRights()
      

      它不必在其他解析中,只需在您的路线控制器或指令/组件中即可。比多个解析器更清洁、更高效。

      【讨论】:

        【解决方案3】:

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

        相反,只需在控制器中注入 $rootScope 并在控制器中使用 $rootScope.specialRights

        示例:

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

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

        【讨论】:

        • 你能举个例子吗?
        猜你喜欢
        • 2013-04-11
        • 2020-04-23
        • 2017-03-23
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        • 2017-08-29
        相关资源
        最近更新 更多