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

Я пытаюсь вызвать «requireRole» из app.config $ routeProvider.

.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' из вашего DI в вашем' config', он больше не нужен. – TheSharpieOne

+0

если я его удалю, то я получаю ReferenceError: securityAuthorization не определен –

+0

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

ответ

1

Вам необходимо передать функцию в качестве второго параметра providerhttps://docs.angularjs.org/guide/providers#provider-recipe

Поскольку вы, кажется, не используете securityAuthorizationProvider, я изменил это, чтобы использовать фабрику. Если вы определяете Factory-рецепт, пустой пуст с помощью метода $ 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'); 
      }); 
     } 
    }; 
}]); 

Где, как настроить маршрутизацию

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

Я пытаюсь вызвать «requireRole», передавая переменную «admin» или «user» из «разрешения» на «routeProvider». –

+0

В этом случае вы, вероятно, не хотите провайдера, вы можете просто использовать фабрику. Я обновил свой ответ на использование фабрики. – TheSharpieOne

Смежные вопросы