所以我使用第三方库来处理我的身份验证,在我的注销功能中,我致电$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,我不明白为什么它还没有被设置。
有人能看到我这样做的地方吗?
答案 0 :(得分:3)
实际上'isLogin' of undefined
说$$route
是undefined
。您不应该使用从$$
开始的属性,因为它们是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
之前过滤此案例。