8

Это состояние конфигурации:Перенаправление состояние в angularjs

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 и его подпункты государства не будет иметь никаких физических взглядов или контроллеров.
Я хочу, чтобы они служили связями, вызывающими определенные функции.

Service для вызова методов ВЫХОД ИЗ СИСТЕМЫ:

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

.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.
И я думаю, что это не очень хороший подход. Кстати, я строю это в телефонной защелке, поэтому использование памяти так важно.

ответ

10

Ооооо, ты так близко. Я переставить некоторые из кода и прибыл на это:

app.run(function($rootScope, $grabhutAccountService) { 
    $rootScope.$on('$stateChangeSuccess', function (evt, toState) { 
    if (toState.name === 'nv.logout') { 
     $grabhutAccountService.logoutUser(); 
     $state.go('account.main'); 
    } 
    }); 
}); 

Следующая основная версия UI-маршрутизатор будет иметь гораздо более совершенные крюки для выполнения такого рода вещи.

Смежные вопросы