AngularJS:了解$ rootScope.$ on('$ routeChangeSuccess

Sim*_*ana 6 redirect angularjs angular-routing

我正在登录页面,成功后,它重定向到主页.默认情况下,我显示登录页面此代码:

app.run(function($rootScope, $location) {
  $rootScope.$on('$routeChangeSuccess', function() {
      $location.url("/login");
  });
});
Run Code Online (Sandbox Code Playgroud)

然后在验证后端的用户/传递详细信息后,我将用户带到主页:

$scope.login = function() {
    if ($scope.username === 'admin' && $scope.password === 'pass') {
      console.log('successful')
      $rootScope.$on('$routeChangeSuccess', function() {
          $location.url("/home")
      });
      $location.url("/blah");
    } else {
      $scope.loginError = "Invalid username/password combination";
      console.log('Login failed..')
    };
  };
Run Code Online (Sandbox Code Playgroud)

如果我在语句$location.urlelse部分之前删除第二个,重定向似乎不起作用if.然而/blah,它没有使用那个url(),它去了home.但是如果blah删除了url ,则重定向逻辑不起作用.

我似乎无法理解为什么我必须使用两个$location.url().如果有人能帮助我理解这个重定向系统是如何工作的,我会觉得有用吗?

这可能不是最好的做法,我愿意接受如何改进的建议,这里是Plunker的例子

Jen*_*ens 4

总而言之,在我看来,这正走在一条错误的道路上......

显然,您需要锁定服务器端的任何资源,因为客户端始终可以在简单的调试器中“更改”...但我想您已经知道...

替代路由解决方案(例如https://github.com/dotJEM/angular-routinghttps://github.com/angular-ui/ui-router IMO)为您提供了一些更好的处理方法,但让我们评估一些方法。 。

一种是:http://plnkr.co/edit/ZUKB1v?p =preview 虽然这需要您解析所有路线上的用户...所以..:(...另一种是:http://plnkr. co/edit/iM9cA1?p=preview可能会好一点...

最后,人们经常做的是提供 http 拦截器,当服务器返回“未经授权”错误代码时,该拦截器会重定向到登录页面。但这似乎是一种比您准备的更先进的方法。