当用户进入特定状态(/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);
})
?
感谢您阅读:)
答案 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});
}
})
}
这可以避免收听事件并将名称存储在某个地方,它只使用转换时可用的内容。相当整洁!