2013-02-15 2 views
14

Надежды любых angularjs гуру может помочь мне с this.Here моего angularjs кодevent.preventDefault() не работает для routeChangeStart в angularjs приложении

$scope.$on('$routeChangeStart', function(event, next, current) { 
       if ($scope.myForm.$dirty) { 
        if(!confirm("Unsaved, do u want to continue?")) { 
         event.preventDefault(); 
        } 
       } 
      }); 

Он предупреждает в браузере задней кнопки мыши, когда данные загрязнен, но при нажатии на отмену или ok он по-прежнему завершает изменение маршрута. Похоже, что event.preventDefault() не работает. Может ли один указать на то, что может быть неправильно

+0

Возможно проверить: HTTP: // StackOverflow.com/questions/14900008/prevent-redirect-behavior-in-angularjs-app –

+0

@Flek, но это решение не будет запрашивать у пользователя подтверждение, а просто не позволит кнопке просмотра вернуться к работе – iJade

+0

Я столкнулся с той же проблемой. Я пробовал как $ routeChangeStart, так и $ locationChangeStart, но никто из них не работал. Вы нашли подходящее решение этой проблемы? – Sam

ответ

3

Согласно AngularJS docs (см в $ трансляции) вы просто не может отменить событие типа вещания ($routeChangeStart имеет такого типа):

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

+0

ok, так что есть какой-либо другой способ обнаружения нажатия кнопки браузера, кроме использования $ routeChangeStart.I уже пробовал locationChangeStart и onbeforeunload, оба не работают – iJade

+0

Я бы сначала вызвал функцию, которая проверяет все зависимости и только если они верны, вы меняете местоположение. Немного больше подробностей о том, что вы на самом деле пытаетесь сделать, было бы хорошо. –

+0

ну на самом деле у меня есть форма. Если у формы есть несохраненные данные, и пользователь нажимает кнопку «Назад в браузере», она запрашивает подтверждение. Это то, что я на самом деле пытаюсь сделать. Это было бы полезно, если бы вы могли опубликовать какой-то код , – iJade

32

У меня было много проблем с поиском это одно, но вместо этого события «$ 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

+0

Это работает для меня! – RolandoCC

+0

Спасибо, спасибо, спасибо! –

2

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

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

5

Fixed именно после углового 1.3.7 https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $ маршруту

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

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

0

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

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

Смежные вопросы