使用$ routeChangeSuccess,角度表现得很奇怪

时间:2014-03-19 16:48:46

标签: javascript angularjs

所以我使用第三方库来处理我的身份验证,在我的注销功能中,我致电$location.url('/login')

但是,在我的app模块中,我试图根据当前路线更改一些CSS。执行此操作的功能如下所示:

app.run(function ($rootScope, $route) {
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
    //Change page css, based on Route information
    $rootScope.isLogin = {
        status: $route.current.$$route.isLogin.status
    };
});
});

在我的配置中,我还指定了一些基于ngRoute的路由,其中​​的参数告诉我当前页面是否是登录页面。

    $routeProvider.
    when('/route1', {
        templateUrl: './partials/route1.html',
        controller: 'Route1Ctrl',
        isLogin: { status: false }
    }).
    when('/login', {
        templateUrl: './partials/login.html',
        controller: 'AuthCtrl',
        isLogin: { status: true }
    }).
    otherwise({
        redirectTo: '/login'
    });

现在,每当我调用logout函数时,我都会收到一个类型错误:Cannot read property 'isLogin' of undefined,它基本上告诉我$route.current.$$route.isLogin.status未设置。考虑到我使用事件$ routeChangeSuccess,我不明白为什么它还没有被设置。

有人能看到我这样做的地方吗?

1 个答案:

答案 0 :(得分:3)

实际上'isLogin' of undefined$$routeundefined。您不应该使用从$$开始的属性,因为它们是Angular的内部属性。在路线上定义isLogout后,您可以通过$route.current.isLogout直接访问它。

<强>的JavaScript

angular.module('app',['ngRoute']).
  config(['$routeProvider', function($routeProvider) {
    $routeProvider.
      when('/route1', {
        template: '<h1>Template 1</h1>',
        isLogin: { status: false }
      }).
      when('/route2', {
        template: '<h1>Template 2</h1>',
        isLogin: { status: true }
      }).
      otherwise({
        redirectTo: '/route1'
      });
  }]).
  run(['$rootScope', function($rootScope) {
    $rootScope.$on("$routeChangeSuccess", function(event, currentRoute, previousRoute){
      if(!currentRoute.redirectTo) { // <= "otherwise" is a route as well, so $routeChangeSuccess is also triggered. However, it does not have `isLogin` property, so filter out this case.
        $rootScope.isLogin = {
          status: currentRoute.isLogin.status
        };
      }
    });
  }]);

Plunker:http://plnkr.co/edit/R4DSz7kV56zpM9EXpNLm?p=preview

修改

$routeChangeSuccess事件的处理程序接收当前路由作为第二个参数。这意味着您可以像currentRoute.isLogin一样直接使用它,而不是将$route服务注入run块,并像$route.current.isLogin一样使用它。

应该提到的另一件事是otherwise配置中的$routeProvider也是一条路线。因此,如果路由器将新的当前路由解析为otherwise,则也会触发$routeChangeSuccess事件(实际上它将被触发两次:第一次用于otherwise路由,第二次用于路由到它重定向到了)。由于otherwise路由没有isLogin属性,因此您应该在尝试访问currentRoute.isLogin之前过滤此案例。