AngularJS:如何对我的应用程序的所有路由使用一个解析
我想解决为我的应用程序的所有页面加载当前用户的承诺。 当前,我在我的路由的每个AngularJS:如何对我的应用程序的所有路由使用一个解析,angularjs,Angularjs,我想解决为我的应用程序的所有页面加载当前用户的承诺。 当前,我在我的路由的每个$routeProvider.when()中重复解析 $routeProvider.when('/users/edit/:userId', { templateUrl: 'app/app/assets/partials/user-edit.html', controller: 'UserEditController', resolve:{ 'currentUser':function( U
$routeProvider.when()
中重复解析
$routeProvider.when('/users/edit/:userId', {
templateUrl: 'app/app/assets/partials/user-edit.html',
controller: 'UserEditController',
resolve:{
'currentUser':function( UserService){
return UserService.getCurrentUser();
}
}
});
$routeProvider.when('/staff_profil/edit', {
templateUrl: 'app/app/assets/partials/profil-edit.html',
controller: 'ProfilEditController',
resolve:{
'currentUser':function( UserService){
return UserService.getCurrentUser();
}
}
});
我的目标是在不重复的情况下解析所有路由的当前用户。您始终可以使用自己的实现将现有的when方法包装在上
var myModule = angular.module('myModule', ['ngRoute'])
.config(['$routeProvider', function($routeProvider){
var originalWhen = $routeProvider.when;
$routeProvider.when = function(path, route){
route.resolve = {
'currentUser':function( UserService){
return UserService.getCurrentUser();
}
};
return originalWhen(path, route);
};
}]);
您可能希望在其中添加一些错误检查,并使用类似于方法的方法,而不是仅仅覆盖现有的resolve属性,但至少通过这种方式,您可以保证所有路由都具有所需的内容
将其封装到助手方法中也很容易。我发现这种情况要好得多:
angular.extend({}, $routeProvider, {
when: function(path, route) {
route.resolve || (route.resolve = {});
route.resolve = angular.merge({}, route.resolve, {
chef: 'OrganizationCheckerProvider'
});
return $routeProvider.when(path, route);
}
});
@Josh答案是正确的,除非您必须以不同方式调用originalWhen函数:
originalWhen.call($routeProvider, path, route);
@N13和我都无法工作。但这确实对我起了作用:
module.config(['$routeProvider', function($routeProvider){
$routeProvider.accessWhen = function(path, route){
route.resolve || (route.resolve = {});
route.resolve.language = "something"
return $routeProvider.when(path, route);
};
}]);
用于:
$routeProvider
.accessWhen('/login', {
...
});
为了完整起见,这里是整个解决方案,使用角度而不是下划线,并带有可链接的“when”。这段代码中并没有什么新内容,只是结合了上面的一系列答案
var originalWhen = $routeProvider.when;
$routeProvider.when = function(path, route) {
route.resolve || (route.resolve = {});
angular.extend(route.resolve, {
CurrentUser : function(User) {
return User.current();
}
});
return originalWhen.call($routeProvider, path, route);
};
对于那些坚持使用旧代码库的人来说
const _when = $routeProvider.when;
$routeProvider.when = (path, route) => _when.call($routeProvider, path, {
...route,
resolve: {
...route.resolve,
'currentUser': [ 'UserService', UserService => UserService.getCurrentUser() ]
}
});
这看起来很棒,但我得到
错误:[$injector:modulerr]未能实例化模块。。。由于:$routeProvider.when(…)未定义
,即使覆盖方法所做的一切都是返回originalWhen(path,route)相反,我添加了一个新方法,$routeProvider.accessWhen
,它可以返回$routeProvider.when(path,route)编码>,并在“我的路由”设置中调用.accessWhen
而不是.when
。如果在实际路由中添加resolve属性,“currentUser”解析不会被覆盖吗?可能route.resolve=route.resolve |{};route.resolve.currentUser=。。。会更好吗?你能用ui路由器做类似的事情吗?当问题是javascript时,应该用javascript回答。
这也使用下划线。。。他/她可能不会使用,好的,改为JS。在这里,我更喜欢lodash/下划线,因为它具有出色的深度合并功能。如果不使用,他/她可以尝试lodash/下划线的替代方案。AngularJS具有类似于lodash实现的\uuu.merge()。对我来说,如果我不使用。call