Подтвердить что ты не робот

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() не работает. Может ли кто-нибудь указать, что может быть неправильно?

4b9b3361

Ответ 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...