Redirection de l'état dans angularjs

C'est la configuration de l'état:

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'
            })  
    });

La nv et de ses sous-états auront pas de points de vue ou des contrôleurs.

Je veux qu'ils servent de liens qui appelle certaines fonctions.

Service pour l'appel de méthodes de déconnexion:

angular.module('grabhutApp')
    .factory('$grabhutAccountService', function ($state, $grabhutDataService) {

        var methods = {     
            .
            .
            logoutUser: function () {
                $grabhutDataService.user.removeSession();
                $state.go('account.main', {}, {location: 'replace'});
            }
            .
            .
        };

        return methods;
    });

Puis un bouton/lien pour se déconnecter:

<a ui-sref="nv.logout" class="button icon icon ion-log-out button-large" menu-close></a>  

Ce que je veux, c'est que, lorsque l'état nv.logout a été déclenchée l'

$grabhutAccountService.logoutUser() doit être appelé et doit rediriger vers 'account.main'

Voici ce que j'ai fait jusqu'à présent:

J'ai essayé d'utiliser les résoudre dans nv.logout

.state('nv.logout', {
    url: '/logout',
    resolve: {
        logout: function ($grabhutAccountService) {
            $grabhutAccountService.logoutUser();
        }
    }
}) 

Le service a été appelé, mais l'etat n'a pas de redirection. J'ai donc essayé une autre façon. J'ai ajouté un contrôleur:

.state('nv.logout', {
    url: '/logout',
    resolve: {
        logout: function ($grabhutAccountService) {
            $grabhutAccountService.logoutUser();
        }
    },
    controller: function ($scope, $state) {
        $scope.$on('$stateChangeSuccess', function () {
            $state.go('account.main');          
        });
    }   
})  

Mais $stateChangeSuccess n'est pas d'être congédié.

J'ai donc essayé d'utiliser le rootScope:

.run(function(...., $grabhutAccountService){

    .
    .
    .
    $rootScope.logout = function(){
        $grabhutAccountService.logoutUser();
    };
    .
    .
    .

})  

Et l'utiliser comme ceci:

<a ng-click="$root.logout()" class="button icon icon ion-log-out button-large" menu-close></a>

Cela fonctionne bien. Mais je suis préoccupante (autant que je sache) rootScope de charges de plus de données, ce qui pourrait entraîner un ralentissement de l'opération.

En outre, chaque fois que j'ai besoin d'une sorte de fonction, comme ci-dessus, je voudrais ajouter en fonction de rootScope de nouveau.

Et je pense que c'est pas une bonne approche. BTW, je suis en train de construire cette phonegap c'est pourquoi l'utilisation de la mémoire est si important.

OriginalL'auteur fiberOptics | 2014-10-03