如何知道ui-router中的下一个状态

时间:2014-01-11 21:17:35

标签: angularjs angular-ui-router

当用户进入特定状态(/login)时,我正在显示并隐藏模态,但如果用户从{{1}转到/register,我会将模态保留在后台}。

如果用户在/login然后转到/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); })

感谢您阅读:)

2 个答案:

答案 0 :(得分:2)

您可以收听$stateChangeStart,并在to功能可访问的某个地方记下onExit参数的值,即可注射的值或服务。

将来会有一个可注射服务代表过渡本身,你可以检查和操作这样的事情。

答案 1 :(得分:2)

到目前为止,我发现的最好的技巧是在onExit函数中使用$ state服务中的promise:

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

这可以避免收听事件并将名称存储在某个地方,它只使用转换时可用的内容。相当整洁!