【问题标题】:Show red border for all invalid fields after submitting form angularjs提交表单angularjs后为所有无效字段显示红色边框
【发布时间】:2013-10-01 12:32:29
【问题描述】:

我有一个表单,其中有一些输入字段。其中有些是必填字段,有些是电子邮件字段。

我对必填字段使用 HTML5 required 属性,对电子邮件字段使用 type="email" 属性。

我的问题是点击提交按钮后,我必须为所有无效字段显示 红色边框

这是我的表格:

<form name="addRelation">
  <label>First Name</label>
  <input type="text" placeholder="First Name" data-ng-model="model.firstName"     id="FirstName" name="FirstName" required/><br/>
  <span class="text-error" data-ng-show="addRelation.submitted && addRelation.FirstName.$error.required">first Name is required</span><br/>
  <label>Last Name</label>
  <input type="text" placeholder="Last Name" data-ng-model="model.lastName" id="LastName" name="LastName" required/><br/>
  <span class="text-error" data-ng-show="addRelation.submitted && addRelation.LastName.$error.required">Last Name is required</span><br/>
  <label>Email</label>
  <input type="email" placeholder="Email" data-ng-model="model.email" id="Email" name="Email" required/><br/>
  <span class="text-error" data-ng-show="addRelation.submitted && addRelation.Email.$error.required">Email address is required</span><br/>
  <span class="text-error" data-ng-show="addRelation.submitted && addRelation.Email.$error.email">Email address is not valid</span><br/>

  <input class="btn" data-ng-click="save(model)" type="button" value="SAVE" />  
  </form>

还有我的保存功能。

$scope.save= function (model) {
    if ($scope.addRelation.$valid) {
        //form is valid- so save it to DB
    }
    else {
        //if form is not valid set $scope.addRelation.submitted to true
        $scope.addRelation.submitted=true;
    }
};
 })

现在,当我点击保存按钮而不填写任何内容时,所有错误(跨度)都会显示出来。但我想为所有无效字段显示红色边框。

我尝试过以下案例:

input.ng-dirty.ng-invalid{border:1px solid black;}

但是当用户直接点击提交按钮时这会失败。(不触摸输入字段)

input.ng-invalid{border:1px solid black;}

一旦用户打开注册表单,就会显示红色边框。

请帮忙。

【问题讨论】:

    标签: forms validation angularjs


    【解决方案1】:

    参考文章:Show red color border for invalid input fields angualrjs

    我在所有输入字段上都使用了 ng-class。如下所示

    <input type="text" ng-class="{submitted:newEmployee.submitted}" placeholder="First Name" data-ng-model="model.firstName" id="FirstName" name="FirstName" required/>
    

    当我点击保存按钮时,我将 newEmployee.submitted 值更改为 true(您可以在我的问题中查看)。所以当我点击保存时,一个名为 submitted 的类被添加到所有输入字段中(还有一些其他类最初由 angularjs 添加)。

    所以现在我的输入字段包含这样的类

    class="ng-pristine ng-invalid submitted"
    

    现在我正在使用下面的 css 代码在所有无效输入字段上显示红色边框(提交表单后)

    input.submitted.ng-invalid
    {
      border:1px solid #f00;
    }
    

    谢谢!!

    更新:

    我们可以在表单元素中添加 ng-class,而不是将其应用于所有输入元素。因此,如果提交了表单,则会将一个新类(已提交)添加到表单元素中。然后我们可以使用下面的选择器选择所有无效的输入字段

    form.submitted .ng-invalid
    {
        border:1px solid #f00;
    }
    

    【讨论】:

    • 酷!但是为什么不在form 元素中添加ng-class 呢?它是单个元素,我们可以将 CSS 规则选择器声明为 form.submitted .ng-invalid
    • @J.Bruni:是的。我们可以申请。这样我们也可以减少代码。感谢您的好主意.. :) 我会更新我的答案。
    • 我只有在使用 addRelation.$submitted 而不是简单的 submitted (Angular v1.3.16) 时才设法让它工作
    • 不需要添加ng-class,使用:.ng-submitted .ng-invalid{...}
    • 由于某种原因,点击 btn 后提交的类未应用于任何输入
    【解决方案2】:

    如果表单已提交,您可以使用默认的 ng-submitted 设置。

    https://docs.angularjs.org/api/ng/directive/form

    示例:http://jsbin.com/cowufugusu/1/

    【讨论】:

    • 您能否详细说明并在可能的情况下提供您的解决方案如何工作的示例?
    • form.ng-提交的 input.ng-invalid { 背景:红色; }
    • 很好的解决方案,这会在提交表单时将一个类应用于子输入。 form.ng-提交的 input.ng-invalid { 背景:红色; }。 form.ng-submitted:这个类在提交时添加到它的表单 input.ng-invalid:子输入类当无效所以当表单提交时,form.ng-submitted 被添加到它。现在要访问子输入使用 input.ng-invalid,查找子无效输入,这会将样式添加到提交表单的无效输入中。
    【解决方案3】:

    我创建了一个working CodePen example 来展示您如何实现目标。

    我将ng-click 添加到&lt;form&gt; 并从您的按钮中删除了逻辑:

    <form name="addRelation" data-ng-click="save(model)">
    ...
    <input class="btn" type="submit" value="SAVE" />
    

    这是更新后的模板:

    <section ng-app="app" ng-controller="MainCtrl">
      <form class="well" name="addRelation" data-ng-click="save(model)">
        <label>First Name</label>
        <input type="text" placeholder="First Name" data-ng-model="model.firstName" id="FirstName" name="FirstName" required/><br/>
        <span class="text-error" data-ng-show="addRelation.submitted && addRelation.FirstName.$invalid">First Name is required</span><br/>
        <label>Last Name</label>
        <input type="text" placeholder="Last Name" data-ng-model="model.lastName" id="LastName" name="LastName" required/><br/>
        <span class="text-error" data-ng-show="addRelation.submitted && addRelation.LastName.$invalid">Last Name is required</span><br/>
        <label>Email</label>
        <input type="email" placeholder="Email" data-ng-model="model.email" id="Email" name="Email" required/><br/>
        <span class="text-error" data-ng-show="addRelation.submitted && addRelation.Email.$error.required">Email address is required</span>
        <span class="text-error" data-ng-show="addRelation.submitted && addRelation.Email.$error.email">Email address is not valid</span><br/>
        <input class="btn" type="submit" value="SAVE" />  
      </form>
    </section>
    

    和控制器代码:

    app.controller('MainCtrl', function($scope) {  
      $scope.save = function(model) {
        $scope.addRelation.submitted = true;
    
        if($scope.addRelation.$valid) {
          // submit to db
          console.log(model); 
        } else {
          console.log('Errors in form data');
        }
      };
    });
    

    我希望这会有所帮助。

    【讨论】:

    • 嗨@Adam:感谢您的回复。我检查了您创建的 CodePan 示例。当我单击保存按钮时,错误会显示在无效的输入字段下。但我应该为所有无效输入字段设置红色边框(这是我的实际要求)。
    猜你喜欢
    • 2014-05-26
    • 2015-04-13
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多