Angular:如何使用一个解析我的应用程序的所有路由

时间:2013-11-12 19:04:28

标签: angularjs

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

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

6 个答案:

答案 0 :(得分: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);
    };

答案 1 :(得分: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);
      };   

   }]);

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

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

答案 2 :(得分:4)

@Josh的回答是正确的,除非您必须以不同的方式调用 originalWhen 函数:

originalWhen.call($routeProvider, path, route);

答案 3 :(得分:3)

@ N13和我都无法使@Josh's solution工作。但这对我有用:

    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', {
           ...
        });

答案 4 :(得分: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);
  }
});

答案 5 :(得分:0)

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

org.apache.kafka.clients