我第一次使用Ionic Mobile Framework获得了一个登录页面,刚刚学习了Angular JS。当登录页面启动时,我想仅在会话未到期时才移动到主页。否则我们想要进入登录页面。它在登出“歌曲”屏幕/状态和登录屏幕/状态之间来回切换,但是我有一个问题。
当应用程序启动时,它会转到歌曲状态或“主页”页面,但是它不会运行该状态的控制器代码。在控制器代码中,我点击了我们网站上的路线,看看会话是否仍处于活动状态。如果是这样,它将返回JSON,否则我的authInterceptor将接管并将状态转换为登录。
底线是控制器未在应用启动时运行,无论我做了多少谷歌搜索,我都无法找到原因。下面是一些代码示例。
.run(function($ionicPlatform, $cordovaSplashscreen, localstorage, $state) {
setTimeout(function() {
$cordovaSplashscreen.hide()
}, 1500)
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if(window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if(window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
if(localstorage.get('subdomain') == undefined ||
localstorage.get('subdomain') == 'null' ||
localstorage.get('subdomain') == null ||
localstorage.get('subdomain') == 'undefined' ||
localstorage.get('subdomain') == "")
{
$state.go('subdomain');
}
else
$state.go('songs');
});
})
.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
$urlRouterProvider.otherwise("/songs");
$stateProvider
.state('login', {
url: "/login",
templateUrl: "templates/login.html",
controller: 'LoginCtrl'
})
.state('subdomain', {
url: "/subdomain",
templateUrl: "templates/subdomain.html",
controller: 'SubdomainCtrl'
})
.state('songs', {
url: "/songs",
templateUrl: "templates/songs.html",
controller: 'SongsCtrl'
})
$httpProvider.interceptors.push('authInterceptor');
});
// register the interceptor as a service
.factory('authInterceptor', function($q, $injector) {
return {
// optional method
'responseError': function(rejection) {
if(rejection.status == 0 || rejection.status == 403){
$injector.get('$state').transitionTo('login',null,{ reload: true, inherit: true, notify: true });
if(rejection.config.url.indexOf('login') > -1){
navigator.notification.alert("Invalid username or password.", function(){}, "Login Failed");
}
}
return $q.reject(rejection);
}
};
})
.controller('SongsCtrl', function($scope, $state, user) {
user.check(); //Resource that hits route on server
$scope.logout = function()
{
user.logout();
$state.go('login');
}
})
非常感谢。 詹姆斯
答案 0 :(得分:0)
问题是拦截器无法处理的错误服务器响应以及糟糕的调试工具的组合,如果控制器在启动时触发,它将不会让我看到。