2014-10-06 50 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