ログインが成功した後、私はlogin
状態からhome
状態に移行することになっています。 home
の前、またはログインした後にアクセス可能な他のどの状態も、コントローラの前に特権/アクセスデータがロードされていることを確認しながら、いくつかのresolve
メソッドを起動します。これを行うために、私は解決で抽象親状態を作成し、login
子状態以外のすべての状態を作りました。ui-routerは抽象的な親から子状態に移行しません
コントローラが$state.go('home')
を起動すると、$stateChangeStart
イベントがトリガされますが、その後にアプリケーションが消えているように見えます。 $stateChangeSuccess
は実行されません。コードをステップ実行すると、$stateChangeStart
の後にデバッガを終了するだけです。状態は変更されていません(まだログインページにあります)。エラーメッセージは表示されません。思考/希望私は、いくつかの簡単な構成が不適切に設定されています。
config.jsの
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('/', {
templateUrl: 'app/components/home/home.html',
controller: 'HomeController',
controllerAs: 'vm',
parent: 'app',
authenticate: true,
data:{
rule: function($rootScope){
return true;
}
}
})
.state('login', {
url: '/login',
templateUrl: 'app/components/login/login.html',
controller: 'LoginController',
controllerAs: 'vm',
reloadOnSearch: false,
authenticate: false,
params: {
'passwordResetSuccess': ''
}
})
.state('forgotPassword', {
url: '/forgotPassword',
templateUrl: 'app/components/login/forgotPassword.html',
controller: 'ForgotPasswordController',
controllerAs: 'vm',
authenticate: false,
params: {
'username':''
}
})
.state('app', {
url:'',
abstract: true,
template: '<div ui-view class="slide-animation"></div>',
resolve:{
privilege: ['privilegesService', function(privilegesService){
return privilegesService.getPrivileges().then(privilegesService.privilegesData)
.catch(privilegesService.getPrivilegesError);
}],
alarms: ['alarmsService', function(alarmsService){
return alarmsService.setAlarms();
}],
firmsData: ['chosenFirmService', function(chosenFirmService){
return chosenFirmService.getFirmsData();
}],
notifications: ['notificationsService', function(notificationsService){
return notificationsService.setupGlobalAccess();
}],
releaseNotes: ['releaseNotesService, $rootScope', function(releaseNotesService, $rootScope){
$rootScope.loadNotificationData();
releaseNotesService.setupGlobalAccess();
return;
}],
setIdle: ['Idle', function(Idle){
Idle.watch();
Idle.setIdle(15*60);
return;
}]
}
})
.state('home', {
url: '/home',
templateUrl: 'app/components/home/home.html',
controller: 'HomeController',
controllerAs: 'vm',
parent: 'app',
authenticate: true,
data:{
rule: function($rootScope){
return true;
}
}
})
app.route.js
$rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
$('[data-toggle="popover"]').popover('hide');
//////////////////
//Check for auth key if missing redirect to login
/////////////////
if(toState.authenticate){
if(authService.authKeyExists()){
var authorized = toState.data ? toState.data.rule ? toState.data.rule($rootScope) : true : true;
if(authorized){
if(toState.url.indexOf("/add") > -1){
$rootScope.selectedFirmId = null;
} else {
$rootScope.selectedFirmId = $rootScope.cachedFirmId;
}
var navigateFromString = fromState && fromState.name ? "Navigated from " + fromState.name + " to " : "Started from ";
navigationService.addNavObject("activity", {
summary : "Page navigation",
activity : navigateFromString + toState.name,
page : $location.absUrl().replace("#/", ""),
level : "debug"
});
} else {
$state.go('home');
}
} else {
event.preventDefault();
$state.go('login');
}
}
});
// Hack because ui-router doesn't save previous $state
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
if(fromState.name){
$state.lastKnownState = {};
$state.lastKnownState.name = toState.name;
$state.lastKnownState.params = toParams;
$state.previousState = {};
$state.previousState.name = fromState.name;
$state.previousState.params = fromParams;
}
});
index.htmlを
<div class="slide-animation-container">
<div ui-view id="ng-view" class="slide-animation"></div>
{{scrollTo}}
</div>