Я пытаюсь использовать AngularJS ModalsService для открытия модального окна, предупреждающего пользователя о том, что несохраненные изменения в их форме будут потеряны, если они будут перемещаться или обновлять страницу. Он должен спросить их, хотят ли они продолжить, и если они нажмут OK, навигация/перезагрузка должны произойти по-прежнему, если они нажмут "Отменить", она должна закрыть модальную и остановить навигацию/перезагрузку.
У меня есть директива, которая создает окно, когда это происходит, но окно игнорирует мой стиль приложений.
Директива acConfirmExit
(function () {
'use strict';
angular.module('SomeModule').directive('acConfirmExit', function () {
return {
scope: {
acConfirmExit: '&',
confirmMessageWindow: '@',
confirmMessageRoute: '@',
confirmMessage: '@'
},
link: function ($scope, elem, attrs) {
window.onbeforeunload = function () {
if ($scope.acConfirmExit()) {
// Launch modal instance
return $scope.confirmMessageWindow || $scope.confirmMessage;
}
}
var $locationChangeStartUnbind = $scope.$on('$locationChangeStart', function (event) {
if ($scope.acConfirmExit()) {
if (!confirm($scope.confirmMessageRoute || $scope.confirmMessage)) {
event.preventDefault();
}
}
});
$scope.$on('$destroy', function () {
window.onbeforeunload = null;
$locationChangeStartUnbind();
});
}
};
});
}());
HTML
<div ac-confirm-exit="dirty"
confirm-message-window="Unsaved changes to this DataDoc. All your changes will be lost."
confirm-message-route="Unsaved changes to this DataDoc. Leave this page without saving your changes?"></div>
EDIT: Извинения я не был ясен, я хочу использовать модальное всплывающее окно, а не стандартное окно браузера, который открывается. Я просто не уверен, как использовать модальное окно с window.onbeforeunload и $ locationChangeStart.
возможно, потому, что ваш код не имеет углового контекста, они находятся в необработанном оконном событии "onbeforeunload".
window.onbeforeunload = function () {
if ($scope.acConfirmExit()) {
// Launch modal instance
return $scope.confirmMessageWindow || $scope.confirmMessage;
}
}
попробуйте ввести $ window и код:
// inject $window
angular.module('SomeModule').directive('acConfirmExit', function ($window) {
// listen onbeforeunload with $window
$window.onbeforeunload = function () {
if ($scope.acConfirmExit()) {
// Launch modal instance
return $scope.confirmMessageWindow || $scope.confirmMessage;
}
}