Подтвердить что ты не робот

Angular: как использовать одно решение для всех маршрутов моего приложения

Я хотел бы решить обещание, которое загружает текущего пользователя для всей страницы моего приложения. Теперь я повторяю решение в каждом маршруте $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();
      }
  }
 });

Моя цель - разрешить мой текущий пользователь для всех маршрутов без повторения.

4b9b3361

Ответ 1

Вы всегда можете связать существующий метод $routeProvider с вашей собственной реализацией.

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 вместо того, чтобы просто переписать существующее свойство разрешения, но по крайней мере таким образом вы можете гарантировать, что все ваши маршруты будут иметь то, что вы хотите.

Также достаточно просто обернуть это в вспомогательный метод.

Ответ 2

Для полноты, вот полное решение, используя angular вместо подчеркивания, с цепным "когда". В этом коде ничего нового нет, просто добавили кучу ответов выше.

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

Ответ 3

Ответ @Josh правильный, за исключением того, что вы должны ссылаться на оригинальную функцию по-разному:

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

Ответ 4

Я обнаружил, что этот случай намного лучше:

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

Оба @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', {
           ...
        });