【问题标题】:Angular form validation: ng-show when at least one input is ng-invalid and ng-dirty角度表单验证:当至少一个输入为 ng-invalid 和 ng-dirty 时 ng-show
【发布时间】:2012-12-30 02:23:50
【问题描述】:

我在 Angular 部分中有以下形式:

<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>

这是丑陋的。有更好的方法吗?

【问题讨论】:

    标签: forms validation angularjs


    【解决方案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>
    

    【讨论】:

    • 不幸的是,这不起作用。如果我在“first_name”中输入一些内容,则表单很脏。但是,我没有在“last_name”中输入任何内容,因此该表单无效。但是,我只想在有一个既脏又无效的单个输入时显示。
    • 是的,这正是我所说的。我现在刚刚习惯了 Angular,但我知道发生了什么。谢谢大佬。
    • 我现在实际上使用过滤器来做类似的事情。我已经更新了答案以反映这一点。就 Angular 而言,这可能是一个“更好的实践”,因为它不会将逻辑与特定范围耦合。
    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多