【问题标题】:Angular get route parameters from location change start从位置更改开始角度获取路线参数
【发布时间】:2014-09-12 12:36:57
【问题描述】:

我有这样的路线设置:

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

例如:

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

如果我改用$routeChangeStart,这会起作用,但是在重定向之前我会短暂看到下一条路线。位置更改似乎阻止了这种情况,但我不知道如何访问路由参数(即身份验证参数)。

我该怎么做?还是完全有更好的方法?

【问题讨论】:

  • Imo 在这种情况下最好使用拦截器docs.angularjs.org/api/ng/service/$http
  • @Whisher 很有趣。你能提供一个示例答案吗?
  • 在 app.js 中的 .run(function(){ //here }) 中添加这个博客
  • @AdityaSethi 什么博客?
  • @Cooper 他的意思是你是在.run 方法块中运行你的代码吗?

标签: javascript angularjs routes


【解决方案1】:

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

【讨论】:

  • 是的,我考虑过 - 尽管我发现解决方案有点复杂。主要的是我不想对每条路线都这样做。最终可能会有数百条路线,所以我想要一种更快更简单的方法。
【解决方案2】:

正如我在评论中所说并应库珀的要求 我贴一个例子:

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

【讨论】:

  • 您正在使用 angular-ui-routes 但 OP 似乎在使用角度 ngRoute
  • 对不起,我没有注意到,但使用 ngRoute,您可以使用完全相同的逻辑或至少作为起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多