检查 angularjs 中未保存的表单数据(使用 ui-router 的多个表单)
check for unsaved form data in angularjs ( multiple forms using ui-router )
实施细节:
我正在使用 ui-router 在 ui-view div 中加载表单页面。我参考了 Andres Ekdahi 的很好的例子,我如何使用相同的指令对多个表单进行 $dirty 检查?
表格 1
<form name="myForm" ng-controller="Controller" confirm-on-exit>
表格2
<form name="iForm" ng-controller="Controller" confirm-on-exit ng-model="myModel">
app.js(指令)
myApp.directive('confirmOnExit', function() {
return {
link: function($scope, elem, attrs) {
// condition when back page is pressed
window.onbeforeunload = function(){
if ($scope.myForm.$dirty) {
return "The formI is dirty, do you want to stay on the page?";
}
}
// condition when user try to load other form (via icons )
$scope.$on('$stateChangeStart', function(event, next, current) {
if ($scope.myForm.$dirty) {
if(!confirm("myForm. Do you want to continue ?")) {
event.preventDefault();
}
}
if ($scope.iForm.$dirty) {
if(!confirm("iform. Do you want to continue ?")) {
event.preventDefault();
}
}
});
}
};
});
错误:
第一次加载页面时,$dirty 值为 false。然后我填写表单详细信息并单击第三个图标(文件),我收到第二个表单脏检查错误 if ($scope.iForm.$dirty)
和 $dirty
警报。
angular.js:12520 TypeError: Cannot read property '$dirty' of undefined
和
<form name="iForm" ng-controller="Controller" confirm-on-exit="" ng-model="myModel" class="ng-pristine ng-untouched ng-valid ng-scope">
演示:Plunker
在检查表单是否脏之前先检查表单是否存在。做类似
的事情
if ($scope.myForm && $scope.myForm.$dirty) {
if(!confirm("myForm. Do you want to continue ?")) {
event.preventDefault();
}
}
if ($scope.iForm && $scope.iForm.$dirty) {
if(!confirm("iform. Do you want to continue ?")) {
event.preventDefault();
}
}
通过从 form
的 name
属性中提取指令,使指令更简单,这样指令中只有一个条件,并且可以在许多地方重复使用。
<form name="myForm" ng-controller="Controller" confirm-on-exit>
代码
var form = $scope[attrs.name]; //which will take out form name & do search that inside scope
if (form.$dirty) { //form object would always exist, to make sure you could also add one more check `form &&`
if(!confirm("myForm. Do you want to continue ?")) {
event.preventDefault();
}
}
有一个更简单的方法。
只需要将指令放在表单元素上并通过 link 函数访问表单控制器:
myApp.directive('confirmOnExit', function() {
return {
require: 'form',
link: function($scope, elem, attrs, formController) {
// condition when back page is pressed
window.onbeforeunload = function(){
if (formController.$dirty) {
return "The form '" + formController.$name + "' is dirty, do you want to stay on the page?";
}
}
// condition when user try to load other form (via icons )
$scope.$on('$stateChangeStart', function(event, next, current) {
if (formController.$dirty) {
if(!confirm(formController.$name + ". Do you want to continue ?")) {
event.preventDefault();
}
}
});
}
};
});
实施细节:
我正在使用 ui-router 在 ui-view div 中加载表单页面。我参考了 Andres Ekdahi 的很好的例子,我如何使用相同的指令对多个表单进行 $dirty 检查?
表格 1
<form name="myForm" ng-controller="Controller" confirm-on-exit>
表格2
<form name="iForm" ng-controller="Controller" confirm-on-exit ng-model="myModel">
app.js(指令)
myApp.directive('confirmOnExit', function() {
return {
link: function($scope, elem, attrs) {
// condition when back page is pressed
window.onbeforeunload = function(){
if ($scope.myForm.$dirty) {
return "The formI is dirty, do you want to stay on the page?";
}
}
// condition when user try to load other form (via icons )
$scope.$on('$stateChangeStart', function(event, next, current) {
if ($scope.myForm.$dirty) {
if(!confirm("myForm. Do you want to continue ?")) {
event.preventDefault();
}
}
if ($scope.iForm.$dirty) {
if(!confirm("iform. Do you want to continue ?")) {
event.preventDefault();
}
}
});
}
};
});
错误:
第一次加载页面时,$dirty 值为 false。然后我填写表单详细信息并单击第三个图标(文件),我收到第二个表单脏检查错误 if ($scope.iForm.$dirty)
和 $dirty
警报。
angular.js:12520 TypeError: Cannot read property '$dirty' of undefined
和
<form name="iForm" ng-controller="Controller" confirm-on-exit="" ng-model="myModel" class="ng-pristine ng-untouched ng-valid ng-scope">
演示:Plunker
在检查表单是否脏之前先检查表单是否存在。做类似
的事情if ($scope.myForm && $scope.myForm.$dirty) {
if(!confirm("myForm. Do you want to continue ?")) {
event.preventDefault();
}
}
if ($scope.iForm && $scope.iForm.$dirty) {
if(!confirm("iform. Do you want to continue ?")) {
event.preventDefault();
}
}
通过从 form
的 name
属性中提取指令,使指令更简单,这样指令中只有一个条件,并且可以在许多地方重复使用。
<form name="myForm" ng-controller="Controller" confirm-on-exit>
代码
var form = $scope[attrs.name]; //which will take out form name & do search that inside scope
if (form.$dirty) { //form object would always exist, to make sure you could also add one more check `form &&`
if(!confirm("myForm. Do you want to continue ?")) {
event.preventDefault();
}
}
有一个更简单的方法。
只需要将指令放在表单元素上并通过 link 函数访问表单控制器:
myApp.directive('confirmOnExit', function() {
return {
require: 'form',
link: function($scope, elem, attrs, formController) {
// condition when back page is pressed
window.onbeforeunload = function(){
if (formController.$dirty) {
return "The form '" + formController.$name + "' is dirty, do you want to stay on the page?";
}
}
// condition when user try to load other form (via icons )
$scope.$on('$stateChangeStart', function(event, next, current) {
if (formController.$dirty) {
if(!confirm(formController.$name + ". Do you want to continue ?")) {
event.preventDefault();
}
}
});
}
};
});