2014-10-06 48 views
0

我正在为应用程序的身份验证部分构建提供程序。我在使用依赖注入器时将值传递给函数时遇到了麻烦。AngularJS函数DI参数

angular.module('security.authorization', ['security.service']) 
.provider('securityAuthorization', { 
    requireRole: ['securityAuthorization', 'rolesAllowed', function(securityAuthorization, rolesAllowed) { 
     return securityAuthorization.requireRole(rolesAllowed); 
    }], 

    $get: ['security', '$q', function(security, $q) { 
     return { 
      requireRole: function(rolesAllowed) { 
       console.log(rolesAllowed); 
      } 
     }; 
    }] 
}); 

我试图从app.config $ routeProvider调用“requireRole”。

.when('/map', { controller: 'MapCtrl', templateUrl: 'partials/user/map.html', 
     resolve: { 
      authenticatedUser: securityAuthorizationProvider.requireRole('user') 
     } 
    }) 

但它给了我

Uncaught Error: [$injector:modulerr] Failed to instantiate module myApp due to: TypeError: object is not a function

UPDATE

app.config(function($routeProvider, $httpProvider, securityAuthorization) { 
    $routeProvider 
    .when('/map', { controller: 'MapCtrl', templateUrl: 'partials/user/map.html', 
     resolve: { 
      authenticatedUser: ['securityAuthorization', function(){ 
       return securityAuthorization.requireRole('user'); 
      }] 
     } 
    }); 
}); 

错误:

Error: [$injector:unpr] Unknown provider: securityAuthorization

+0

删除'securityAuthorization'在'config',它不再需要在那里。 – TheSharpieOne 2014-10-06 19:26:18

+0

如果我删除它,那么我得到ReferenceError:securityAuthorization没有被定义 – 2014-10-06 19:45:16

+0

'authenticatedUser:['securityAuthorization',function(securityAuthorization){ return securityAuthorization.requireRole('user'); }]' – TheSharpieOne 2014-10-06 20:11:17

回答

1

你需要通过一个函数作为第二个参数为providerhttps://docs.angularjs.org/guide/providers#provider-recipe

由于您似乎没有使用securityAuthorizationProvider,我已将此更改为使用工厂。如果你定义了一个Factory配方,那么一个空的Provider类型的$ get方法将被设置为你的工厂函数,这是自动创建的。

.factory('securityAuthorization', ['security', '$q', function(security, $q) { 
    return { 
     requireRole: function(rolesAllowed) { 
      // require that there is an authenticated user 
      return security.auth().then(function(user) { 
       if (!security.isAuthenticated()) { 
        $q.reject('/signin'); 
       } 
       else { 
        // check if role is allowed 
        if (rolesAllowed.indexOf(user.role) == -1) { 
         $q.reject('/signin'); 
        } 
        else { 
         if (user.defaultPassword) { 
          $q.reject('/change-password'); 
         } 
         else { 
          // This was in the original post, but $q doesn't have resolve 
          $q.resolve(); 
         } 
        } 
       } 
      }, function(){ 
       $q.reject('/signin'); 
      }); 
     } 
    }; 
}]); 

哪里是如何建立从DI路由

app.config(function($routeProvider, $httpProvider) { 
    $routeProvider 
     .when('/map', { controller: 'MapCtrl', templateUrl: 'partials/user/map.html', 
      resolve: { 
       authenticatedUser: ['securityAuthorization', function(securityAuthorization){ 
        return securityAuthorization.requireRole('user'); 
       }] 
      } 
     }); 
}); 
+0

编辑我的问题,请看看! – 2014-10-06 18:55:01

+0

我试图调用“requireRole”从“routeProvider”上的“resolve”传递像“admin”或“user”这样的变量。 – 2014-10-06 19:02:12

+0

在这种情况下,您可能不想提供商,您可以只使用工厂。我更新了使用工厂的答案。 – TheSharpieOne 2014-10-06 19:07:04