AngularJs。$ setPristine重置表单

表单提交后,我一直在努力重置表单。 有人张贴这个在这我想使它工作,但没有成功。 这是我的代码示例 。

$scope.form.$setPristine(); 没有将Pristine: {{user_form.$pristine}}true 。 看上面的例子。

$ setPristine()是在angularjs的1.1.x分支中引入的。 您需要使用该版本而不是1.0.7才能使其工作。

请参阅http://plnkr.co/edit/815Bml?p=preview

只为那些想要获得$setPristine而无需升级到v1.1.x的人,这里是我用来模拟$setPristine函数的函数。 我不愿意使用v1.1.5,因为我使用的一个AngularUI组件是不兼容的。

  var setPristine = function(form){ if(form.$setPristine){//only supported from v1.1.x form.$setPristine(); }else{ /* *Underscore looping form properties, you can use for loop too like: *for(var i in form){ * var input = form[i]; ... */ _.each(form, function (input) { if (input.$dirty) { input.$dirty = false; } }); } }; 

请注意,它只会使$dirty字段变干净,并帮助更改“显示错误”条件,如$scope.myForm.myField.$dirty && $scope.myForm.myField.$invalid

表单对象的其他部分(如css类)仍然需要考虑,但这解决了我的问题:隐藏错误消息。

DavidLn的回答在过去对我很有帮助 。 但是它并没有捕获setPristine的所有function,这一次让我失望了。 这是一个更完整的垫片:

 var form_set_pristine = function(form){ // 2013-12-20 DF TODO: remove this function on Angular 1.1.x+ upgrade // function is included natively if(form.$setPristine){ form.$setPristine(); } else { form.$pristine = true; form.$dirty = false; angular.forEach(form, function (input, key) { if (input.$pristine) input.$pristine = true; if (input.$dirty) { input.$dirty = false; } }); } }; 

有一个类似的问题,我不得不将表单重新设置为原始的,但也没有触及,因为$ invalid和$ error都被用来显示错误信息。 只有使用setPristine()不足以清除错误消息。

我通过使用setPristine()和setUntouched()来解决它。 (请参阅Angular的文档: https : //docs.angularjs.org/api/ng/type/ngModel.NgModelController )

所以,在我的控制器中,我使用了:

 $scope.form.setPristine(); $scope.form.setUntouched(); 

这两个函数将完整的表单重置为$ pristine并返回到$ notouched,以便清除所有错误消息。

我解决了同样的问题,在Angular版本1.0.7(no $ setPristine方法)中,

在我的使用案例中,表格在填写和提交之后必须消失,直到再次填写另一条logging为止。 所以我用ng-switch而不是ng-show来实现显示/隐藏效果。 正如我怀疑,使用ng-switch,表单DOM子树被完全删除,以后重新创build。 所以原始状态会自动恢复。

我喜欢它,因为它简单而干净,但可能不适合任何人的用例。

这也可能意味着一些性能问题的大表格(?)在我的情况下,我还没有面对这个问题呢。

原始forms还有另外一种方式,就是将forms发送给控制器。 例如:-

鉴于: –

 <form name="myForm" ng-submit="addUser(myForm)" novalidate> <input type="text" ng-mode="user.name"/> <span style="color:red" ng-show="myForm.name.$dirty && myForm.name.$invalid"> <span ng-show="myForm.name.$error.required">Name is required.</span> </span> <button ng-disabled="myForm.$invalid">Add User</button> </form> 

在控制器中: –

 $scope.addUser = function(myForm) { myForm.$setPristine(); };