31

我想解决为我的应用程序的所有页面加载当前用户的承诺。$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();
      }
  }
 });

我的目标是在不重复的情况下为所有路线解析我当前的用户。

4

6 回答 6

27

为了完整起见,这里是整个解决方案,使用角度而不是下划线,并带有可链接的“何时”。这段代码没有什么新东西,只是结合了上面的一堆答案。

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);
    };
于 2015-01-16T01:15:58.377 回答
24

$routeProvider你总是可以用你自己的实现来包装现有的 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);
      };   

   }]);

您可能希望在其中添加一些错误检查,并使用类似下划线defaults的方法,而不是仅仅覆盖现有的解析属性,但至少这样您可以保证您的所有路由都具有您想要的内容。

将其包装成辅助方法也很容易。

于 2013-11-12T19:36:08.020 回答
4

@Josh 的答案是正确的,除了你必须以不同的方式调用originalWhen函数:

originalWhen.call($routeProvider, path, route);
于 2014-11-13T12:05:21.273 回答
3

@N13 和我都无法使@Josh 的解决方案起作用。但这确实对我有用:

    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', {
           ...
        });
于 2015-01-12T23:35:46.410 回答
2

我发现这种情况好多了:

angular.extend({}, $routeProvider, {
  when: function(path, route) {
    route.resolve || (route.resolve = {});
    route.resolve = angular.merge({}, route.resolve, {
      chef: 'OrganizationCheckerProvider'
    });
    return $routeProvider.when(path, route);
  }
});
于 2014-08-17T16:54:23.457 回答
0

对于那些坚持使用旧代码库的人。

const _when = $routeProvider.when;
$routeProvider.when = (path, route) => _when.call($routeProvider, path, {
  ...route,
  resolve: {
    ...route.resolve,
    'currentUser': [ 'UserService', UserService => UserService.getCurrentUser() ]
  }
});
于 2019-03-06T16:23:44.803 回答