Директива AngularJS для обнаружения ожидающих изменений перед уходом/закрытием страницы

У меня проблема. У меня есть регистрационная форма и много других форм. Теперь я хочу проверить, не загрязнена ли форма, а затем я приношу окно подтверждения, если они действительно хотят покинуть/закрыть эту страницу.
Прежде всего, когда я возвращаюсь с помощью кнопки «Назад» браузера, а не с помощью другой кнопка ([кнопка..] всего 4 примера) окно подтверждения появляется два раза, и после двух подтверждений я все еще на той же странице, просто форма сбрасывается. Когда я нажимаю свою, все работает нормально.
Во-вторых, когда я закрываю браузер, появляется мое окно подтверждения, а затем также появляется окно подтверждения браузера, но мне нужен только один из них.

$scope.$on('$locationChangeStart', function (event, next, current) {
    if ($scope.requestForm.$dirty) {
        if (!$window.confirm('Unsaved Changes, leave Page?')) {
            //cancel leaving view2
            //works when clicking links, but doesn't work when using the back button
            event.preventDefault();
        }
    } else {

    }
});

$scope.$watch("requestForm.$dirty", function (newval) {
    window.myGlobalDirtyFlag = newval;
});

window.onbeforeunload = function (e) {
    if (window.myGlobalDirtyFlag === true) {
        if (!$window.confirm('Unsaved Changes, close Page?')) {
            //cancel leaving view2
            //works when clicking links, but doesn't work when using the back button
            return false;
        } else {

        }
    }
};

$scope.$on("$destroy", function () {
    window.myGlobalDirtyFlag = false;
});

Может у кого-то также есть идея, как я могу внести это в директиву AngularJS, чтобы мне не приходилось копировать этот код для каждого сайта, на котором у меня есть форма. (Каждая страница имеет только 1 форму, но имя каждой формы отличается!)
Мои контроллеры находятся в отдельных файлах javascript (функция blablaController() {}), и я передаю это для каждого routeProvider в моем файле конфигурации (templateUrl: blabla .html, контроллер: blabalController)

С уважением,
Антракс


person Anthrax    schedule 15.10.2013    source источник
comment
почему бы не добавить его в корневую область?   -  person lucuma    schedule 15.10.2013
comment
Ну, я должен сказать, я не очень хорошо работаю с rootScope и директивами без примера.. :/ Я думал о том, чтобы получить форму вида var form = $('button[type=submit]').closest( форма); или что-то еще, и добавьте этот параметр, чтобы он работал для каждой формы.   -  person Anthrax    schedule 15.10.2013


Ответы (1)


Вот служба и директива, которая отвечает на ваш вопрос. Вероятно, единственное изменение, которое вы могли бы рассмотреть, — это использование $window вместо окна внутри службы. Как указано в инструкциях, вы просто добавите атрибут unsaved-changes-warning в свою форму.

https://github.com/facultymatt/angular-unsavedChanges

person lucuma    schedule 15.10.2013