角度表单验证:当至少一个输入为ng-invalid和ng-dirty时显示ng-ng

时间:2013-01-15 21:13:07

标签: forms validation angularjs

我在Angular partial中有以下表格:

<form name="submit_entry_form" id="submit_entry_form" ng-submit="submit()" ng-controller="SubmitEntryFormCtrl" novalidate >
    <input type="text" name="first_name" ng-model="first_name" placeholder="First Name" required/><br />
    <input type="text" name="last_name" ng-model="last_name" placeholder="Last Name" required/><br />
    <input type="text" name="email" ng-model="email" placeholder="Email Address" required/><br />
    <input type="text" name="confirm_email" ng-model="confirm_email" placeholder="Confirm Email Address" required/><br />
    <span ng-show="submit_entry_form.$invalid">Error!</span>
    <input type="submit" id="submit" value="Submit" />
</form>

我遇到的麻烦是底部的跨度是“错误!”。我希望这只显示其中一个输入是“ng-dirty”和“ng-invalid”。如上所述,错误将显示,直到表单完全有效。长期解决方案是做类似的事情:

<span ng-show="submit_entry_form.first_name.$dirty && submit_entry_form.first_name.$invalid || submit_entry_form.last_name.$dirty && submit_entry_form.last_name.$invalid || submit_entry_form.email.$dirty && submit_entry_form.email.$invalid || submit_entry_form.confirm_email.$dirty && submit_entry_form.confirm_email.$invalid">Error!</span>

哪个是UGLY。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:17)

方法1:使用控制器设置的$ scope上的函数。

因此,为了更好地了解您的问题,您希望在表单上的任何字段同时为$ invalid和$ dirty 时显示一条消息...

添加控制器方法:

app.controller('MainCtrl', function($scope) {

  $scope.anyDirtyAndInvalid = function (form){
    for(var prop in form) {
      if(form.hasOwnProperty(prop)) {
         if(form[prop].$dirty && form[prop].$invalid) {
           return true;
         }
      }
    }
    return false;
  };
});

并在您的HTML中:

<span ng-show="anyDirtyAndInvalid(submit_entry_form);">Error!</span>

Here is a plunker to demo it

现在所有这些都表示,如果有人在您的表单中输入了数据,并且该数据未完成,则表单本身 无效。所以我不确定这是最好的可用性。但它应该有用。


方法2:使用过滤器! (推荐)

我现在推荐一种过滤器用于此类事情......

以下过滤器与上面的过滤器相同,但对于Angular,IMO来说,这是更好的做法。 Also a plunk.

app.filter('anyInvalidDirtyFields', function () {
  return function(form) {
    for(var prop in form) {
      if(form.hasOwnProperty(prop)) {
        if(form[prop].$invalid && form[prop].$dirty) {
          return true; 
        }
      }
    }
    return false;
  };
});
<span ng-show="submit_entry_form | anyInvalidDirtyFields">Error!</span>