これは状態構成です:
_angular
.module('grabhutApp', [...])
.config(function ($stateProvider, $urlRouterProvider) {
$stateProvider
// ACCOUNT
.state('account', {
abstract: true,
url: '/account',
templateUrl: 'index.html'
})
.state('account.main', {
url: '',
templateUrl: 'views/account/account.login.html',
controller: 'AccountController'
})
.
.
.
// NO VIEWS
.state('nv', {
abstract: true,
url: '/nv'
})
.state('nv.logout', {
url: '/logout'
})
});
_
nv
とそのサブ状態には、物理的なビューやコントローラーはありません。
特定の関数を呼び出すリンクとして機能させたい。
ログアウトメソッドを呼び出すためのサービス:
_angular.module('grabhutApp')
.factory('$grabhutAccountService', function ($state, $grabhutDataService) {
var methods = {
.
.
logoutUser: function () {
$grabhutDataService.user.removeSession();
$state.go('account.main', {}, {location: 'replace'});
}
.
.
};
return methods;
});
_
次にログアウト用のボタン/リンク:
_<a ui-sref="nv.logout" class="button icon icon ion-log-out button-large" menu-close></a>
_
私がしたいのは、状態_nv.logout
_がトリガーされたときに$grabhutAccountService.logoutUser()
を呼び出し、_'account.main'
_にリダイレクトする必要があります
これが私がこれまでにしたことです:
_nv.logout
_でresolveを使用しようとしました
_.state('nv.logout', {
url: '/logout',
resolve: {
logout: function ($grabhutAccountService) {
$grabhutAccountService.logoutUser();
}
}
})
_
サービスは呼び出されましたが、状態はリダイレクトされませんでした。だから私は別の方法を試しました。コントローラーを追加しました:
_.state('nv.logout', {
url: '/logout',
resolve: {
logout: function ($grabhutAccountService) {
$grabhutAccountService.logoutUser();
}
},
controller: function ($scope, $state) {
$scope.$on('$stateChangeSuccess', function () {
$state.go('account.main');
});
}
})
_
しかし、_$stateChangeSuccess
_は解雇されていません。
それで私はrootScopeを使おうとしました:
_.run(function(...., $grabhutAccountService){
.
.
.
$rootScope.logout = function(){
$grabhutAccountService.logoutUser();
};
.
.
.
})
_
そしてこのように使用してください:
<a ng-click="$root.logout()" class="button icon icon ion-log-out button-large" menu-close></a>
これは正常に機能します。しかし、(AFAIK)rootScopeがより多くのデータをロードし、動作が遅くなる可能性があるため、心配しています。
その上、上記のような関数が必要なときはいつでも、rootScopeに関数を再度アタッチする必要があります。
そして、それは良いアプローチではないと思います。ところで、私はこれをphonegapで構築しているので、メモリ使用量が非常に重要です。
ああ、あなたはとても近いです。私はあなたのコードのいくつかを再配置し、これに到達しました:
app.run(function($rootScope, $grabhutAccountService) {
$rootScope.$on('$stateChangeSuccess', function (evt, toState) {
if (toState.name === 'nv.logout') {
$grabhutAccountService.logoutUser();
$state.go('account.main');
}
});
});
UI-Routerの次のメジャーバージョンでは、この種のことを行うためのフックが大幅に改善されます。