Mis*_*hko 6 angularjs angular-ui-router
我的ui-router配置如下:
$stateProvider
.state('app', {
url: '/app',
abstract: true,
templateUrl: 'sidemenu/sidemenu.html',
controller: 'SideMenuCtrl'
})
.state('login', {
url: '/login',
templateUrl: 'login/login.html',
controller: 'LoginCtrl'
})
.state('app.dashboard', {
url: '/dashboard',
views: {
menuContent: {
templateUrl: 'dashboard/dashboard.html',
controller: 'DashboardCtrl'
}
}
})
[More states here]
$urlRouterProvider.otherwise('/app/dashboard');
Run Code Online (Sandbox Code Playgroud)
当用户导航到/app/dashboard我想检查他们是否被授权时,然后:
/login如果未经授权,则重定向到,或这似乎可以解决问题:(基于此示例)
$rootScope.$on('$stateChangeSuccess', function(event) {
var path = $location.path();
if (path === '/login') {
return;
}
// Halt state change from even starting
event.preventDefault();
Auth.getCurrentUser().then(function(currentUser) {
if (currentUser === null) {
$state.go('login');
} else {
// Continue with the update and state transition
$urlRouter.sync();
}
});
});
Run Code Online (Sandbox Code Playgroud)
此解决方案的唯一问题是,如果未授权用户导航到仪表板,则首先可以看到仪表板模板.只有在授权响应返回时,它才会更改为登录模板.
在我们授权用户时,有没有办法不显示仪表板?
我也试图改变$stateChangeSuccess到$stateChangeStart,但它并没有真正的工作(路由似乎然后被彻底打破).
使用解析块怎么样?
.state('app.dashboard', {
url: '/dashboard',
views: {
menuContent: {
templateUrl: 'dashboard/dashboard.html',
controller: 'DashboardCtrl',
resolve: {
login: function($q, Auth) {
var deferred = $q.defer();
Auth.getCurrentUser().then(function(currentUser) {
if (currentUser == null) {
deferred.reject();
} else {
deferred.resolve();
}
});
return deferred.promise;
}
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
状态变化不会发生,直到承诺得到解决,因此模板不应该显示.拒绝承诺将$stateChangeError根据此答案提出,因此您需要处理该错误并重定向到登录页面.