2014-09-12 79 views
0

我的路線設置,像這樣:角獲取路由參數開始

app.config(function($routeProvider) { 

    $routeProvider 

    //login 
    .when("/", { 
    templateUrl : "framework/views/login.html", 
    controller : "LoginCtrl", 
    title: "Login", 
    authenticate: false 
    }) 

    //dashboard 
.when("/dashboard", { 
    templateUrl : "framework/views/dashboard.html", 
    controller : "DashboardCtrl", 
    title: "Dashboard", 
    authenticate: true 
    }); 
}); 

現在我想如果authenticate設置爲true路線上的重定向位置的變化,但一個session variabletrue

例如:

$rootScope.$on("$locationChangeStart", function(event, newURL, oldURL){ 
    if (toState.authenticate && $window.sessionStorage.isLoggedIn) { 
    $location.path("/"); 
    } 
}); 

這工作,如果我用$routeChangeStart代替,但我簡要地看的下一個路由重定向之前。位置改變似乎停止了,但我不能解決如何訪問路由參數(即驗證參數)。

我該怎麼做?或者有更好的方法嗎?

+0

Imo在這種情況下更好使用攔截器https://docs.angularjs.org/api/ng/service/$http – Whisher 2014-09-12 12:59:32

+0

@Whisher有趣。你能提供一個範例答案嗎? – Coop 2014-09-12 13:04:00

+0

在.run(function(){// here})中添加此博客的app.js – 2014-09-12 13:34:58

回答

0

您應該使用.when()中的resolve參數。這是一個承諾,您可以在渲染視圖之前設置必須滿足的某些標準。您可以在這裏找到一個很好的演示視頻:https://egghead.io/lessons/angularjs-resolve

+0

我認爲那是 - 雖然我覺得解析有點複雜。最主要的是我不希望每條路線都這樣做。最終可能有數百條路線,所以我想要一個更快更簡單的方法。 – Coop 2014-09-12 13:59:22

+0

看看https://gist.github.com/davemo/5815716 – Cathal 2014-09-12 14:03:41

+0

更好的解決方案:http://stackoverflow.com/a/19938307/659858 – KingOfHypocrites 2015-07-30 21:38:29

0

正如我在評論和庫珀 的需求說我發佈一個例子:

angular.module('myApp',[]) 
    .factory('httpInterceptor', ['$q', '$location',function ($q, $location) { 
     var canceller = $q.defer(); 
     return { 
      'request': function(config) { 
       // promise that should abort the request when resolved. 
       config.timeout = canceller.promise; 
       return config; 
      }, 
      'response': function(response) { 
       return response; 
      }, 
      'responseError': function(rejection) { 
       if (rejection.status === 401) { 
        canceller.resolve('Unauthorized'); 
        $location.url('/user/signin'); 
       } 
       if (rejection.status === 403) { 
        canceller.resolve('Forbidden'); 
        $location.url('/'); 
       } 
       return $q.reject(rejection); 
      } 

     }; 
    } 
    ]) 
    //Http Intercpetor to check auth failures for xhr requests 
    .config(['$httpProvider',function($httpProvider) { 
     $httpProvider.interceptors.push('httpInterceptor'); 
    }]) 
    .config(['$stateProvider',function($stateProvider) { 

     // states for users 
     $stateProvider 
     .state('users', { 
      abstract: true, 
      templateUrl: 'users/views/users.html', 
      resolve: { 
       issessionedin: function(Sessions){ 
        return Sessions.isLoggedIn(); 
       } 
      } 
     }) 
     .state('users.account', { 
      url: '/user/account/:id', 
      templateUrl: 'users/views/account.html', 
      resolve: { 
       user: function(Users, $stateParams){ 
        return Users.get($stateParams.id); 
       } 
      }, 
      controller:'UserAccountController' 
     }) 
    }]) 
    .factory('Sessions', ['$http', 
     function($http) { 
      return{ 
       isSessionedIn :function() { 
        $http.get('/api/v1/issessionedin'); 
       }, 
       isLoggedIn :function() { 
        $http.get('/api/v1/isloggedin'); 
       }, 
       hasAccess :function(permission) { 
        $http.get('/api/v1/hasaccess/'+permission); 
       } 
      }; 
     } 
    ]); 
當然

你需要的代碼服務器端返回的HTTP狀態代碼

+0

您正在使用'angular-ui-routes',但OP似乎使用angulars'ngRoute' – 2014-09-12 14:54:39

+0

對不起,我沒有注意到,但也與ngRoute你可以使用完全相同的邏輯或至少作爲出發點。 – Whisher 2014-09-12 15:39:41