Опираясь на Ответ Rishabh и использование местоположения sergey.skipReload от this Angular Issue, вы можете использовать следующее, чтобы создать диалог по изменению маршрута, отложить изменение url на неопределенный срок (фактически «отменить» изменение маршрута) и переписать строку URL обратно в '/'без дополнительной перезагрузки:
//Override normal $location with this version that allows location.skipReload().path(...)
// Be aware that url bar can now get out of sync with what's being displayed, so take care when using skipReload to avoid this.
// From https://github.com/angular/angular.js/issues/1699#issuecomment-22511464
app.factory('location', [
'$location',
'$route',
'$rootScope',
function ($location, $route, $rootScope) {
$location.skipReload = function() {
var lastRoute = $route.current;
var un = $rootScope.$on('$locationChangeSuccess', function() {
$route.current = lastRoute;
un();
});
return $location;
};
return $location;
}
]);
app
.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/home', {
controller: 'HomeCtrl',
templateUrl: 'Home/HomeView.html'
})
.when('/profile/:userId/changepwd', {
template: ' ',
controller: '',
resolve: {
data1: function($dialog, location, $q){
$dialog.messageBox(title, msg, btns)
.open()
.then(function(result){
//fires on modal close: rewrite url bar back to '/home'
location.skipReload().path('/home');
//Could also rewrite browser history here using location?
});
return $q.defer().promise; //Never resolves, so template ' ' and empty controller never actually get used.
}
}
})
.otherwise({
redirectTo: '/'
});
Это похоже на то, что оно утечки неразрешенных обещаний, и может быть более аккуратное решение, но это сработало для моих целей.
Когда вы говорите «отменить» маршрут, вы имеете в виду отправить пользователя обратно туда, откуда он пришел ('$ window.history.back()'), или перенаправить его после того, как он закончит взаимодействие с диалоговым окном (' $ location.path ('/ новый') ')? –