检查angularjs中未保存的表单数据(使用ui路由器的多个表单)

check for unsaved form data in angularjs ( multiple forms using ui-router )

本文关键字:表单 ui 路由器 使用 数据 angularjs 保存 检查      更新时间:2023-09-26

实现细节:

我正在使用ui路由器在ui视图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

有一种更简单的方法。

只需将您的指令放在表单元素上,并通过链接功能访问表单控制器:

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();
                        }
                    }
                });
            }
        };
    });

formname属性中提取指令,使指令更加简单,这样一个指令中只有一个条件&它可以在许多地方重复使用。

<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();
    }
}

此处演示

在检查表单是否脏之前,先检查表单是否存在。做一些类似的事情

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();
    }
}