2014-10-06 3 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'); 
      }] 
     } 
    }); 
}); 

오류 : 당신은 0123에 두 번째 매개 변수로 함수를 전달해야

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

+0

제거'securityAuthorization'을 설정하는 방법, 그것은 더 이상이 필요하지 않습니다. – TheSharpieOne

+0

내가 그것을 제거하면 ReferenceError : securityAuthorization이 정의되지 않았습니다. –

+0

'authenticatedUser : [ 'securityAuthorization', function (securityAuthorization) { return securityAuthorization.requireRole ('user'); }]' – TheSharpieOne

답변

1

https://docs.angularjs.org/guide/providers#provider-recipe

securityAuthorizationProvider을 사용하고 있지 않으므로 공장을 사용하도록 변경했습니다. 팩토리 래서 피를 정의하면 $ 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'); 
      }); 
     } 
    }; 
}]); 

은 어디`config`에 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

제 질문을 수정했습니다. –

+0

"routeProvider"의 "resolve"에서 "admin"또는 "user"와 같은 변수를 전달하는 "requireRole"을 호출하려고합니다. –

+0

이 경우 공급자를 원하지 않고 공장을 사용할 수도 있습니다. 공장을 사용하기 위해 답을 업데이트했습니다. – TheSharpieOne