24

$rootScope.$on('$routeChangeStart', function(event, next, current) を使用して、ルートに認証が必要な場合はサインイン ページにリダイレクトしています。これは完全に機能します。

サインインした後、意図したルートにリダイレクトするにはどうすればよいですか?

4

3 に答える 3

25

これは私のために働いているものの簡略化されたバージョンです:

app = angular.module('ngApp', []).config(function ($routeProvider) {
  $routeProvider
    .when('/dashboard', {
        templateUrl: 'dashboard.html',
        controller: 'dashboardController',
        loginRequired: true //
      })
    .when('/login', {
        templateUrl: 'login.html',
        controller: 'loginController'
      })
    .otherwise({redirectTo: '/login'})
});

次に、アプリケーションの実行ブロックで:

app.run(function ($location, $rootScope) {
    var postLogInRoute;

    $rootScope.$on('$routeChangeStart', function (event, nextRoute, currentRoute) {

    //if login required and you're logged out, capture the current path
        if (nextRoute.loginRequired && Account.loggedOut()) {
          postLogInRoute = $location.path();
          $location.path('/login').replace();
        } else if (postLogInRoute && Account.loggedIn()) {
    //once logged in, redirect to the last route and reset it
          $location.path(postLogInRoute).replace();
          postLogInRoute = null;
        }
    });
});
于 2015-01-06T05:34:45.253 に答える
1

次の回答はOPからのものです。


これが私がそれを解決した方法です:

このイベント ブロードキャストを $routeChangeStart に追加しました

$rootScope.$on('$routeChangeStart', function(event, next, current) { 

  if (next.authRequired) {

    var deferred = $q.defer(),
          _token = mainConfig.csrfToken;

    security.getCurrentUser(true, _token).success(function (data, status, headers, config)     {

      if(status == 200) {
        // set the local scope variables
        next.scope.isAuthenticated = true;
        next.scope.user = security.currentUser;
        // Broadcast out to each of the listeners
        $rootScope.$broadcast('currentUserAuthenticated');

      // Any other response requires a signin.  Redirect.  
      } else {
        next.scope.isAuthenticated = false;
        next.scope.user = null;
        $rootScope.$broadcast('authenticationRequired', $location.url());
        $location.path('/signin');
      }
    });
  }
});

次に、セキュリティ ファクトリでイベントをリッスンし、次のように場所を保存しました。

$rootScope.$on('authenticationRequired', function(event, callingRoute) {
redirectRoute = callingRoute;
});
于 2015-07-16T12:29:15.817 に答える