2014-09-12 81 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