Event.preventDefault() не работает для routeChangeStart в приложении angularjs
Надеюсь, что любые угловые гуру могут помочь мне с этим. Вот мой код angularjs
$scope.$on('$routeChangeStart', function(event, next, current) {
if ($scope.myForm.$dirty) {
if(!confirm("Unsaved, do u want to continue?")) {
event.preventDefault();
}
}
});
Он предупреждает о нажатии кнопки браузера, когда данные загрязнены, но при нажатии на отмену или в порядке по-прежнему выполняется изменение маршрута. Похоже, что event.preventDefault()
не работает.
Может ли кто-нибудь указать, что может быть неправильно?
Ответы
Ответ 1
У меня было много проблем с поиском этого, но вместо события "$ routeChangeStart" вы можете прослушать событие "$ locationChangeStart", для которого вы можете предотвратить по умолчанию:
$scope.$on("$locationChangeStart", function(event, next, current) {
if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) {
event.preventDefault();
}
});
Вы также можете всегда предотвращать по умолчанию, хранить "следующий" и отображать чистый JS-модаль и решать асинхронно.
$locationChangeStart в настоящее время недокументирован, но упоминается здесь: https://github.com/angular/angular.js/issues/2109
Ответ 2
Исправлено точно после Angular 1.3.7
https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $route
$routeChangeStart
Передано до изменения маршрута. На этом этапе службы маршрутизации начинают разрешать все зависимости, необходимые для изменения маршрута. Обычно это включает в себя получение шаблона представления, а также любых зависимостей, определенных в свойстве свойства route. Как только все зависимости будут разрешены, $routeChangeSuccess запущен.
Изменение маршрута (и изменение местоположения $, вызвавшее его), можно предотвратить, вызвав метод preventDefault события. Подробнее об объекте события см. В $rootScope.Scope.
Ответ 3
В соответствии с AngularJS docs (см. в $broadcast) вы просто не можете отменить событие типа ($routeChangeStart относится к этому типу):
Жизненный цикл события начинается с области, в которой называется. Все слушатели, которые прослушивают событие имени в этой области, получают уведомление. Впоследствии это событие распространяется на все прямые и косвенные области текущего объема и называет всех зарегистрированных слушателей путь. Событие не может быть отменено.
Ответ 4
Эта проблема была исправлена в новейших версиях ( >= 1.3.8).
Поскольку аргументы, переданные в $routeChangeStart, более подробно (и часто более полезны), если возможно, попробуйте обновить версию angular...