我解决了它。
我有以下状态:
$stateProvider.state("default.mychannels.modalpopup", {
url: 'XXX',
data: { isModal: true },
onEnter: ['$stateParams', '$state', '$modal', function ($stateParams, $state, $modal) {
modal = $modal.open({
...
});
}],
onExit: function() {
modal.close();
}
});
正如你所看到的,我设置一个数据属性,说明这种状态是否是一个模式或没有。
然后在$ stateChangeStart事件中,我做到以下几点:
$rootScope.$on('$stateChangeStart', function (event, to, toParams, from, fromParams) {
var isModal = false;
if (to.data != undefined) {
isModal = to.data.isModal == undefined ? false : to.data.isModal;
}
if (isModal) {
event.preventDefault();
$state.go(to, toParams, {
location: false, notify: false
});
} else {
var requiresAuth = to.data && to.data.requiresAuth;
var isAuthenticated = authenticationService.isLoggedIn();
if (requiresAuth) {
if (!isAuthenticated) {
event.preventDefault();
event.currentScope.loginConfirmedState = to.name;
event.currentScope.loginConfirmedStateParams = toParams;
// user is not logged in
$rootScope.$broadcast('event:auth-loginRequired');
}
} else {
$rootScope.$broadcast('event:auth-loginNotRequired');
}
}
$rootScope.previousState = from;
$rootScope.previousStateParams = fromParams;
});
此代码段的重要组成部分,除了拿起isModal数据属性,都是性质正在向去功能。
$state.go(to, toParams, {
location: false, notify: false
});
您需要将$ state.go选项中设置的位置,以假 - 这不会更新浏览器的URL(因此不会进入浏览器后退历史)。
您还需要在$ state.go选项中将notify设置为false - 这将防止由于从其中调用$ state.go而再次调用$ stateProvider。这将防止无限循环。
很简单,但我很难找到解决方案,但最终解决了它。