it-swarm.com.ru

event.preventDefault () не работает для routeChangeStart в приложении angularjs

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

14
iJade

У меня было много проблем с поиском этого, но вместо события "$ routeChangeStart" вы можете прослушать событие "$ locationChangeStart", для которого вы можете запретить использование по умолчанию:

$scope.$on("$locationChangeStart", function(event, next, current) {
    if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) {
        event.preventDefault();
    }
});

Вы также можете всегда запретить default, хранить «next», отображать чистый модальный JS и решать асинхронно.

$ locationChangeStart в настоящее время недокументировано, но на него ссылаются здесь: https://github.com/angular/angular.js/issues/2109

32
Zorglub

Исправлено именно после Angular 1.3.7 https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $ route

$ routeChangeStart Трансляция перед изменением маршрута. В этот момент службы маршрутизации начинают разрешать все зависимости, необходимые для изменения маршрута. Как правило, это включает выбор шаблона представления, а также любых зависимостей, определенных в свойстве разрешения маршрута. Как только все зависимости разрешены, запускается $ routeChangeSuccess.

Изменение маршрута (и изменение $ location, которое его вызвало) можно предотвратить, вызвав метод warnDefault для события. Смотрите $ rootScope.Scope для более подробной информации об объекте события.

5
Roy Calderon

В соответствии с AngularJS docs (см. В $ broadcast) вы просто не можете отменить событие типа вещания ( $ routeChangeStart относится к этому типу):

Жизненный цикл события начинается с области, в которой $ broadcast был называется. Все слушатели, слушающие событие name в этой области, получают уведомление. После этого событие распространяется на все прямые и косвенные Области действия текущей области и вызывает всех зарегистрированных слушателей путь. Событие не может быть отменено.

3
F Lekschas

Эта проблема была исправлена ​​в новейших версиях (> = 1.3.8).

Поскольку аргументы, предоставляемые в $ routeChangeStart, более подробны (и часто более полезны), по возможности, попробуйте обновить свою угловую версию ...

2
Marcelo C.

Проблема может сохраняться, если вы используете $stateProvider. В этом случае используйте: 

$scope.$on('$stateChangeStart', function( event){
  .....
  event.preventDefault();
});

0
john