Angularjs 如何知道ui路由器中的下一个状态
当用户进入特定状态(Angularjs 如何知道ui路由器中的下一个状态,angularjs,angular-ui-router,Angularjs,Angular Ui Router,当用户进入特定状态(/login)时,我会显示和隐藏模式,但如果用户从/login进入/register,我会将模式保留在后台 如果用户在/login中,然后转到/register,我将使用登录模式保持打开状态,而如果用户在/login中,然后转到其他页面,我将使用登录模式消失 实际上,我是这样设置角度ui路由器的: app.config(function ($stateProvider, $urlRouterProvider, $locationProvider) { $stateProv
/login
)时,我会显示和隐藏模式,但如果用户从/login
进入/register
,我会将模式保留在后台
如果用户在/login
中,然后转到/register
,我将使用登录模式保持打开状态,而如果用户在/login
中,然后转到其他页面,我将使用登录模式消失
实际上,我是这样设置角度ui路由器的:
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);
})
是否有办法设置条件,如“!nextState.Is('register')”
感谢阅读:)您可以收听
$stateChangeStart
并在onExit
函数可以访问的某个位置,即可注入的值或服务,记录参数的值
将来,将有一个代表转换本身的可注入服务,您可以对其进行检查和操作。到目前为止,我发现的最好的技巧是在$state服务内的onExit
函数中使用承诺:
onExit: function ($state) {
$state.transition.then(toState => {
if (toState.name === 'nameOfTheWantedNextState') {
$state.go($state.current, {}, {reload: true});
}
})
}
这避免了侦听事件和将名称存储在某处,它只使用转换时可用的名称。相当整洁 有关于这项服务的消息吗?如果onExit
回调必须像$stateChangeStart
一样声明和toParams,那就太好了。这同样适用于onEnter