从位置更改开始的角度获取路径参数

时间:2014-09-12 12:36:58

标签: javascript angularjs routes

我的路线设置如下:

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设置为truesession variable不是true,我想重定向位置更改。

例如:

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

如果我改为使用$routeChangeStart,那么这是有效的,但在重定向之前我会看到下一个路由。位置变化似乎停止了,但我无法弄清楚如何访问路由参数(即authenticate参数)。

我该怎么做?或者完全有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

你应该在.when()中使用resolve参数。这可以作为一种承诺,您可以在呈现视图之前设置必须满足的某些条件。您可以在此处找到一个很好的演示视频:https://egghead.io/lessons/angularjs-resolve

答案 1 :(得分:0)

正如我在Cooper的评论和要求中所述 我发布了一个例子:

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状态代码