Javascript 非函数时的自定义路由提供程序

Javascript 非函数时的自定义路由提供程序,javascript,angularjs,Javascript,Angularjs,这是今天早上一个问题的更新版本 我有两个独立的模块,“管理”和“授权”。在授权的提供者块中,我扩展了$routeProvider,以便将相同的路由附加到所有路由定义 首先,这里是admin.js: angular.module('authorization', []) .provider('$appRoute', function () { this.$get = function($routeProvider) { var universalRe

这是今天早上一个问题的更新版本

我有两个独立的模块,“管理”和“授权”。在授权的提供者块中,我扩展了
$routeProvider
,以便将相同的路由附加到所有路由定义

首先,这里是admin.js:

angular.module('authorization', [])
    .provider('$appRoute', function () {
        this.$get = function($routeProvider) {
            var universalResolves = {authorize: function($authorization) {
                    return $authorization.authorize();
                }};

            var extendedRouter = angular.extend({}, $routeProvider, {
                when: function(path, route) {
                    route.resolve = (route.resolve) ? route.resolve : {};
                    angular.extend(route.resolve, universalResolves);
                    $routeProvider.when(path, route);
                    return this;
                }
            });

            return new extendedRouter();
        }
    })
    .factory('$authorization', ['$http', '$location', function($http, $location) {

        var $authorization = {};

        $authorization.authorize = function() {

            var path = $location.path();

            return promise = $http.get('/svc/authorize/view?urlPath=' + path).then(function(response) {
                var data = response.data;
                if (response.data.result === 'NOT_AUTHORIZED') {
                    throw "NOT_AUTHORIZED";
                }

                return data;
            });

        };

        return $authorization;
    }]);
接下来,我的管理模块:

angular.module('admin', ['ngRoute', 'ngSanitize', 'ngCsv'
        , 'authorization'
    ])

    .controller('mainCtrl', function() {

    })
    .config(['$routeProvider', '$appRouteProvider', function($routeProvider, $appRouteProvider) {

        // old definition that needs to be changed to $appRouteProvider
        $routeProvider.when('/login', {
            templateUrl: '/login/auth.html',
            controller: 'loginCtrl'
        });

        $appRouteProvider.when('/page', {
            templateUrl: 'page.tmpl.html',
            controller: 'pageCtrl'
        });
不幸的是,我得到了以下错误:

Error: [$injector:modulerr] Failed to instantiate module app due to:
$appRouteProvider.when is not a function
@https://localhost:8443/admin.js:87:9
invoke@https://localhost:8443/js/angular/angular.js:4718:16
runInvokeQueue@https://localhost:8443/js/angular/angular.js:4611:11
loadModules/<@https://localhost:8443/js/angular/angular.js:4620:11
forEach@https://localhost:8443/js/angular/angular.js:321:11
loadModules@https://localhost:8443/js/angular/angular.js:4601:5
loadModules/<@https://localhost:8443/js/angular/angular.js:4618:40
forEach@https://localhost:8443/js/angular/angular.js:321:11
loadModules@https://localhost:8443/js/angular/angular.js:4601:5
createInjector@https://localhost:8443/js/angular/angular.js:4523:19
doBootstrap@https://localhost:8443/js/angular/angular.js:1758:20
bootstrap@https://localhost:8443/js/angular/angular.js:1779:12
angularInit@https://localhost:8443/js/angular/angular.js:1664:5
@https://localhost:8443/js/angular/angular.js:31763:5
j@https://localhost:8443/js/jquery/jquery.min.js:2:29566
g/</k<@https://localhost:8443/js/jquery/jquery.min.js:2:29882
错误:[$injector:modulerr]未能实例化模块应用程序,原因是:
$appRouteProvider.when不是函数
@https://localhost:8443/admin.js:87:9
invoke@https://localhost:8443/js/angular/angular.js:4718:16
runInvokeQueue@https://localhost:8443/js/angular/angular.js:4611:11

loadModules/仅就错误而言,
$appRoute
提供程序本身没有公开任何方法(除了
$get
)。因此,它是一个空的api配置提供程序对象

使用基本提供程序配方时,使用
$get
方法提供生成服务的函数,来自
提供程序的
this
用于绑定额外的配置函数,以放置
$get
函数以后可以使用的数据

发件人:


如果要在提供程序上添加其他方法,可以使用
this.when=…
Angular.extends(this…)
例如。

我最终使用了一个比扩展路由提供程序更简单的解决方案

在我的“顶层”模块中,我用以下代码修改了所有路线:

angular.module('app'[])
    .run(function($route) {
        var keys = Object.keys($route.routes);
        keys.forEach(function(key) {
            var modifiedRoute = $route.routes[key];

            // if there's already a resolve function defined, don't overwrite it, just add a new one
            modifiedRoute.resolve = key.resolve?key.resolve:{};
            modifiedRoute.resolve.authorize = function($authorization) {
                return $authorization.authorize();
            }

            $route[key] = modifiedRoute;
        });
     });

这是因为路由已经在其他模块
.config()
块中定义,这些模块在
run()
块之前执行。它有点难看,但它可以工作。

但是我还没有在angular.extend()方法中这样做吗?在我创建where()函数的过程中,代码正在执行
angular.extends({},
,这意味着你扩展了一个空对象。我想你正在寻找
angular.extends(这,…)
但是我用
$routeProvider
的内容扩展了一个空对象,然后用我定义新对象的时间的对象的内容。该链接特别指出,如果要保留原始对象,可以通过传递一个空对象作为目标来实现。我不确定我是否理解onfig
使用了“$appRouteProvider”。当
时,
$appRouteProvider`就是我们之前在
提供程序(
$appRoute'…)
中得到的
此`方法,否则不会暴露任何方法。执行`angular.extends({}..)在$get中返回结果并没有达到这个目标。您仍然只是在get方法中进行扩展。这太晚了。正如答案所述,必须在主函数中完成,并将其作为基本对象。
angular.module('app'[])
    .run(function($route) {
        var keys = Object.keys($route.routes);
        keys.forEach(function(key) {
            var modifiedRoute = $route.routes[key];

            // if there's already a resolve function defined, don't overwrite it, just add a new one
            modifiedRoute.resolve = key.resolve?key.resolve:{};
            modifiedRoute.resolve.authorize = function($authorization) {
                return $authorization.authorize();
            }

            $route[key] = modifiedRoute;
        });
     });