2014-01-11 34 views
4

當用戶轉到特定狀態(/login)時,我顯示並隱藏了一個模式,但如果用戶從/login轉到/register,我會將模式保留在後臺。如何知道ui路由器中的下一個狀態

如果用戶在/login,然後去/register,我會登錄模式保持打開,而如果用戶在/login,然後去不同的頁面,我會登錄模式消失。

其實我設置這樣的Angular-ui-router$stateProvider

app.config(function ($stateProvider, $urlRouterProvider, $locationProvider) { 
    $stateProvider 
    .state('home', { 
     url: "/", 
     templateUrl: "templates/home.html", 
     controller: 'HomeCtrl' 
    }) 
    .state('login', { 
     url: "/login", 
     onEnter: function ($stateParams, $state, Modal) { 
     // * modalCtrl for Login 
     if (window.loginModal) { 
      window.loginModal.remove(); 
      delete window.loginModal; 
      Modal.fromTemplateUrl('templates/user/login.html', function (modal) { 
      window.loginModal = modal; 
      loginModal.show(); 
      }); 
     } else { 
      Modal.fromTemplateUrl('templates/user/login.html', function (modal) { 
      window.loginModal = modal; 
      loginModal.show(); 
      }); 
     } 
     }, 
     onExit: function ($stateParams, $state) { 
     if (window.loginModal && /* condition like "!nextState.is('register')" */) { 
      window.loginModal.hide(); 
     } 
     } 
    }) 
    .state('register', { 
     url: "/register", 
     onEnter: function ($stateParams, $state, Modal, SlideBoxDelegate) { 
     // * modalCtrl for Register 
     if (window.registerModal) { 
      window.registerModal.remove(); 
      delete window.registerModal; 
      Modal.fromTemplateUrl('templates/user/register.html', function (modal) { 
      window.registerModal = modal; 
      SlideBoxDelegate.update(); 
      registerModal.show(); 
      }); 
     } else { 
      Modal.fromTemplateUrl('templates/user/register.html', function (modal) { 
      window.registerModal = modal; 
      SlideBoxDelegate.update(); 
      registerModal.show(); 
      }); 
     } 
     }, 
     onExit: function ($stateParams, $state) { 
     if (window.registerModal) { 
      window.registerModal.hide(); 
     } 
     } 
    }) 
    .state('not_found', { 
     url: "/not_found", 
     templateUrl: 'templates/not_found.html', 
     controller: 'NotFoundCtrl' 
    }) 
    $urlRouterProvider.otherwise("/not_found"); 
    $locationProvider.html5Mode(true); 
}) 

有沒有一種方法來設置condition like "!nextState.is('register')"

謝謝您的閱讀:)

回答

2

您可以偵聽$stateChangeStart並注意to參數一些地方,是您onExit功能來訪問,即一種可注射的價值或服務的價值。

未來,將會有一個注入服務代表過渡本身,您將能夠檢查和操縱這樣的事情。

+0

有關此服務的任何詞語? – kentcdodds

+0

如果'onExit'回調具有* toState *和* toParams *就好像'$ stateChangeStart'那樣。同樣適用於'onEnter' – JobaDiniz

2

到目前爲止,我已經找到了最好的訣竅是使用$狀態服務中的承諾,在onExit功能:

onExit: function ($state) { 
    $state.transition.then(toState => { 
    if (toState.name === 'nameOfTheWantedNextState') { 
     $state.go($state.current, {}, {reload: true}); 
    } 
    }) 
} 

這避免聽事件和地方存儲的名稱,它僅使用在過渡期間有什麼可用的。很整齊!