AngularJS - Обнаружение, остановка и отмена изменений маршрута

Я вижу событие $routeChangeStart в моем контроллере, но я не вижу, как сказать Angular, чтобы он остался. Мне нужно вывести что-то вроде "Хотите сохранить, удалить или отменить?" и оставаться на текущей "странице", если пользователь выбирает отмену. Я не вижу никаких событий, которые позволяют слушателям отменять изменение маршрута.

Ответ 1

Вы слушаете неправильное событие, я немного искал поисковые запросы, но ничего не нашел в документах. Быстрый тест:

$scope.$on("$locationChangeStart", function(event){
    event.preventDefault();
})

В глобальном контроллере не удалось изменить местоположение.

Ответ 2

Документированный способ сделать это - использовать свойство разрешения маршрутов.

В сервисной документации "$ route" указано, что событие "$ routeChangeError" запущено, если отклонено любое из "разрешения" promises. 1 Это означает, что вы можете использовать "$routeProvider" для указания функции, которая возвращает обещание, которое позже будет отклонено, если вы хотите предотвратить изменение маршрута.

Одним из преимуществ этого метода является то, что обещание может быть разрешено или отклонено на основе результатов асинхронных задач.

Ответ 3

$scope.$watch("$locationChangeStart", function(event){
    event.preventDefault(); 
});

Вы тоже можете это сделать. Выгода от этого заключается в том, что это не запускается через оператор if() с $on... как вы хорошо видите что под кодом будет срабатывать независимо от условий:

if(condition){ //it doesn't matter what the condition is true or false
  $scope.$on("$locationChangeStart", function(event){ //this gets triggered
     event.preventDefault();  
  }); 
}