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及其子狀態將沒有任何物理視圖或控制器。
我希望它們作爲調用某些功能的鏈接。

服務調用註銷方法:

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-路由器的下一個主要版本將有很大改善掛鉤做這樣的事情。