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

   }]);

そこにいくつかのエラー チェックを追加し、既存の resolve プロパティを上書きする代わりにアンダースコアdefaultsメソッドのようなものを使用することをお勧めしますが、少なくともこの方法では、すべてのルートに必要なものがあることを保証できます。

これをヘルパー メソッドにラップするのも簡単です。

于 2013-11-12T19:36:08.020 に答える