我解決了它。
我有以下狀態:
$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。這將防止無限循環。
很簡單,但我很難找到解決方案,但最終解決了它。