如果用户试图留下未保存的已编辑表单,则会弹出一个消息框
“此页面要求您确认是否要离开 - 您输入的数据可能不会保存。离开页面并留在页面上”
我们可以通过浏览器的一些特殊功能来调用这个确认框吗?我想在 AngularJS 应用程序中实现它
如果用户试图留下未保存的已编辑表单,则会弹出一个消息框
“此页面要求您确认是否要离开 - 您输入的数据可能不会保存。离开页面并留在页面上”
我们可以通过浏览器的一些特殊功能来调用这个确认框吗?我想在 AngularJS 应用程序中实现它
Warlock 的回答部分正确,但这样做会破坏可测试性。
在 Angular 中,你会想要使用$window,并且你会想要$dirty
在你的表单上观看。您需要有一个命名的表格,请注意name="myForm"
下面。然后你可以$watch
$dirty
在你的表格上$scope
:
app.controller('MainCtrl', function($scope, $window) {
$scope.name = 'World';
var win = $window;
$scope.$watch('myForm.$dirty', function(value) {
if(value) {
win.onbeforeunload = function(){
return 'Your message here';
};
}
});
});
HTML
<form name="myForm">
Name: <input type="text" ng-model="name"/>
</form>
这是一个演示:http://plnkr.co/edit/3NHpU1
您可以使用“onbeforeunload”事件。语法如下:
window.onbeforeunload = function () {
return "Your text string you want displayed in the box";
}
此事件将弹出您在上面描述的确认对话框,询问用户是否真的想要离开页面。
希望这可以帮助。
如果您想在确定您的表单脏时取消路由更改,您可以这样做:
$rootScope.$on('$locationChangeStart', function(event) {
event.preventDefault();
});
这将取消路由并让您留在当前页面。
我喜欢@blesh 的回答,但我认为它无法解释内部 url 更改(例如,如果您在应用程序上使用 ngView 并访问不同的内部视图)。window.onbeforeunload 永远不会在哈希 # 更改时被调用。在这种情况下,您必须同时监听 window.onbeforeunload 和 $locationChangeStart:
app.controller('OtherCtrl', ['$scope', '$window', '$location', '$rootScope', function($scope, $window, $location, $rootScope) {
$scope.message = "This time you get a confirmation.";
$scope.navigate = function() {
$location.path("/main");
}
var getMessage = function() {
if($scope.myForm.$dirty) {
return $scope.message;
} else {
return null;
}
}
$window.onbeforeunload = getMessage;
var $offFunction = $rootScope.$on('$locationChangeStart', function(e) {
var message = getMessage();
if(message && !confirm($scope.message)) {
e.preventDefault();
} else {
$offFunction();
}
});
}]);
在此处查看 plunkr:http://plnkr.co/edit/R0Riek?p= preview
您可以使用 jQuery 使用这个简单的不显眼的代码轻松保护您的表单。放在</body>
结束标签之前。
(function () {
jQuery('form').one('change', function () {
window.onbeforeunload = function () {
return 'Form protection';
};
});
})();
我认为您需要使用$window.alert
or$window.confirm
或 beforeroutechange