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