1

在每次更改路线时,我都需要检查用户是否已登录。如果没有,我需要将用户重定向到登录页面,否则显示该页面。

我有一个 ng-view 的父控制器:

<body ng-controller="init">
<div ng=view=""></div>
</body> 

因为我需要检查用户是否登录all the the route changes, I needed to add the check globally.

因此,我尝试在 init 控制器中添加检查,例如:

$scope.$on('$locationChangeStart',function(event, newUrl, oldUrl) {
 CheckSession.get(function(data) {
                                    //user is logged in thus let the user continue
                  },function(data) {
                                     //user is logged out
                                     $location.path('login');
                  });
};

这种方法的问题在于:

当路由发生变化时,页面加载1-2秒,因为此时还没有收到ajax调用成功,js不等待ajax调用响应。然后,当它被接收到并且失败时,页面将重定向到登录。

此外,我无法添加event.preventdefault()$locationChangeStart 的开头,因为它会在无限循环中发送整个站点。

我需要:

  1. 一些方法可以阻止位置更改,直到没有收到 ajax 调用响应。
  2. 某种方式可以将此检查添加到所有位置更改,而无需手动将解析添加到 app.js 中 routeProvider 中的每个 $route。
4

1 回答 1

0

您应该将$locationChangeStart事件添加到$rootScope而不是$scope.
这将确保您只需要定义一次:每个页面范围都从内部扩展,$rootScope因此事件在每个页面/范围中都是已知的。

至于等待位置变化,确保你的ajax调用是同步的,如果是异步的,你的逻辑不会等到调用完成。

于 2014-05-19T11:06:12.627 回答