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

Fla*_*ert 30 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();
      }
  }
 });
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*app 27

为了完整性,这里是整个解决方案,使用角度而不是下划线,带有可链接的"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);
    };
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 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);
      };   

   }]);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这看起来不错,但是我得到了`错误:[$ injector:modulerr]无法实例化模块......由于:$ routeProvider.when(...)是undefined`,即使所有的override方法都是`return originalWhen (路径,路径);`相反,我添加了一个新方法`$ routeProvider.accessWhen`,它可以`返回$ routeProvider.when(path,route);`,并调用`.accessWhen`而不是`.when`在我的路线设置中. (4认同)