【问题标题】:AngularJS function DI parameterAngularJS函数DI参数
【发布时间】:2014-12-01 02:06:52
【问题描述】:

我正在为应用程序的身份验证部分构建提供程序。使用依赖注入器时,我无法将值传递给函数。

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')
        }
    })

但它给了我

未捕获的错误:[$injector:modulerr] 无法实例化模块 myApp 由于:TypeError: object is not a function

更新

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

错误:

错误:[$injector:unpr] 未知提供者:securityAuthorization

【问题讨论】:

  • config 中的 DI 中删除 securityAuthorization,那里不再需要它。
  • 如果我删除它,然后我得到 ReferenceError: securityAuthorization is not defined
  • authenticatedUser: ['securityAuthorization', function(securityAuthorization){ return securityAuthorization.requireRole('user'); }]
  • 非常感谢,我为孔问题苦苦挣扎了好几个小时。现在一切正常:)

标签: javascript angularjs dependency-injection


【解决方案1】:

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

由于您似乎没有使用securityAuthorizationProvider,因此我已将其更改为使用工厂。如果您定义了工厂配方,则会在后台自动创建一个空的 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');
            });
        }
    };
}]);

在哪里设置路由

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

【讨论】:

  • 我正在尝试调用“requireRole”,从“routeProvider”上的“resolve”传递一个变量,如“admin”或“user”。
  • 在这种情况下,您可能不想提供,您可以使用工厂。我更新了我的答案以使用工厂。
  • TypeError: undefined is not a function。当我打电话时... .when('/map', { controller: 'MapCtrl', templateUrl: 'partials/user/map.html', resolve: {authenticatedUser: securityAuthorizationProvider.requireRole('user') } })。回答“您曾经在 .config(...) 中使用过 securityAuthorizationProvider 吗?”是的!我就是这样做的
  • 你想在那里使用securityAuthorization。我将更新我的答案以显示如何将其放入 when
猜你喜欢
  • 2018-04-04
  • 1970-01-01
  • 2011-10-19
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2015-11-06
相关资源
最近更新 更多