Angular: Como usar uma resolução para todas as rotas da minha aplicação

Gostaria de resolver a promise de quem carregar o usuário atual para toda a página do meu aplicativo. Agora repito a resolução em cada $ routeProvider.when () das minhas rotas.

$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(); } } }); 

Meu objective é resolver o meu usuário atual para todas as rotas sem repetição.

Você sempre pode encapsular o método when existente no $routeProvider com sua própria implementação.

 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); }; }]); 

Você provavelmente deseja adicionar alguma verificação de erros lá e usar algo como o método de defaults sublinhados , em vez de simplesmente sobrescrever a propriedade de resolução existente, mas pelo menos dessa forma você pode garantir que todas as suas rotas tenham o que você deseja.

Também é fácil colocá-lo em um método auxiliar.

Para completar, aqui está toda a solução, usando angular ao invés de sublinhado, com um ‘quando’ em cadeia. Nada de novo neste código, apenas combinou um monte de respostas acima.

 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); }; 

A resposta do @Josh está correta, exceto que você tem que invocar a function originalWhen de maneira diferente:

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

Ambos @ N13 e eu não conseguimos fazer a solução de @ Josh funcionar. Mas isso funcionou para mim:

  module.config(['$routeProvider', function($routeProvider){ $routeProvider.accessWhen = function(path, route){ route.resolve || (route.resolve = {}); route.resolve.language = "something" return $routeProvider.when(path, route); }; }]); 

usar com:

 $routeProvider .accessWhen('/login', { ... }); 

Eu achei esse caso muito melhor:

 angular.extend({}, $routeProvider, { when: function(path, route) { route.resolve || (route.resolve = {}); route.resolve = angular.merge({}, route.resolve, { chef: 'OrganizationCheckerProvider' }); return $routeProvider.when(path, route); } });