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