AngularJS Forms

533 阅读1分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

AngularJS表格处理简介

AngularJS有一些功能,可以将HTML表单输入字段的数据绑定到模型对象($scope)。这些功能使处理表单变得更加容易。

您可以使用ng-model指令将输入字段绑定到模型属性,如下所示:

<input type="text" id="firstName" ng-model="myForm.firstName">

此绑定是双向的,这意味着如果$scope.myForm.firstName在相应的控制器函数中设置了一个值,则输入字段将以该值开头。此外,一旦用户在文本字段中键入内容,该值将从文本字段复制到$scope.myForm.firstName属性中。

以下是您可以玩的完整AngularJS表单示例:

image.png

此示例将表单中的两个输入字段绑定到$scope.myForm.firstName$scope.myForm.lastName属性。这两个属性在控制器函数中都有一个值集。这些值将在页面首次呈现时显示在输入字段中。当用户在文本字段中键入内容时,它也会被复制到这些属性中。

该示例还包含两个插值指令('{{}}')。这两个指令将插入' myForm. html '的值。firstName’和‘myForm。lastName '下面的表单字段。当你在文本框中输入内容时,它将被复制到“myForm”中。firstName’和‘myForm。lastName属性。从那里,它将被两个插值指令插入到HTML中。这个数据绑定发生在用户在表单字段中输入数据时,因此插值指令将在输入时更新值(这看起来很酷,但我不记得上次实际需要它是什么时候了

绑定复选框

如果您将复选框(<input type="checkbox">)绑定到模型属性,则选中复选框时模型属性将设置为true,如果没有,则设置为false

如果你需要在模型中插入其他值而不是' true '和' false ',你可以使用' ng-true-value '和' ng-false-value '指令,像这样:

<input type="checkbox" ng-model="myForm.wantNewsletter"ng-true-value="yes" ng-false-value="no" >

绑定无线电按钮

单选按钮也很容易绑定到模型属性。如果您有一组单选按钮,只需将它们绑定到相同的模型属性即可。所选的单选按钮的值将复制到模型属性中。以下是一个例子:

<input type="radio" ng-model="myForm.whichNewsletter" value="weeklyNews"><input type="radio" ng-model="myForm.whichNewsletter" value="monthlyNews">

绑定选择框

select框绑定到建模属性也相当简单。以下是一个例子:

image.png

ng选项

译文: 你可以让AngularJS根据来自' $scope '对象的数据创建选项元素,而不是使用静态HTML选项。你可以使用' select '元素中的' ng-options '指令来实现。下面是一个例子:\

image.png

ng-options指令遵循以下格式:

optionBinding expression   dataSource expression

dataSource expression指定了$scope对象中哪些数据将用作option元素的数据源。在上面的示例中,dataSource expression是以下部分:

for obj in myForm.options

它将obj定义为myForm.options数组中的每个对象。因此,将从$scope对象中的myForm.options数组中的每个元素生成一个option元素。

optionBinding expression指定要用作每个option元素的value和标签的属性。在上面的示例中,optionBinding是这部分:

obj.id as obj.name

这将每个对象的obj.id属性定义为生成的每个option元素的value,将obj.name属性定义为标签。如果您希望value和标签来自同一属性,只需省略as obj.name部分(表达式的标签部分)。

您可以从optionBinding expressiondataSource expression内部调用$scope对象上的函数。以下是一个例子:

obj.id as getLabelName(obj) for obj in getOptionArray()

此示例将使用从getLabelName(obj)函数调用返回的值作为标签,并将迭代getOptionArray()函数调用返回的对象。

你可以通过在' optionBinding '表达式中添加' group by '部分来创建选项组(' ' HTML元素,其中包含' option '元素)。下面是一个例子:

obj.id as obj.name group by obj.type

此示例将使用obj.type属性将生成的option元素分组到optgroup元素中,以确定要分组哪些option元素。theobjobj.type属性中值相同的对象将被分组到相同的optgroup元素中。

您还可以迭代对象的属性,而不是迭代对象数组。以下是一个例子:

propName as propValue for (propName, propValue) in objectWithProperties

此示例将把属性名称绑定为option元素value,将属性值绑定为$scope.objectWithProperties对象中的所有属性值和标签。

空选项

如果控制器函数为$scope对象中的选择框设置的值与任何option元素的value属性不匹配,AngularJS会在选择框中插入一个空option元素。

您可以通过在HTML中插入option元素来设置此空option元素的标签,如下所示:

  <form>
        <select ng-model="myForm.car"
                ng-options="obj.id as obj.name for obj in myForm.options" >
            <option value="">Please choose a car</option>
        </select>
    </form>

选择多个选项

如果您需要一个选择框,使用户能够选择多个选项,您需要在<select>元素中插入multiple="true"属性。

启用多个选项选择后,数据绑定将发生变化。现在,它不再将<select>元素绑定到单个字符串值,而是绑定到值数组。因此,您还使用数组设置所选值。以下是一个例子,表明:

image.png

表单验证

AngularJS有一套表单验证指令,您可以使用。AngularJS在将表单字段的值复制到绑定表单字段的$scope属性之前对其进行验证。如果窗体字段无效,则其值不会复制到绑定到的$scope属性中。相反,相应的$scope属性被清除。这样做是为了防止$scope属性包含无效值。

以下各节涵盖了每个表单验证指令。

ng-minlength + ng-maxlength

ng-minlengthng-maxlength表单验证指令可用于验证表单字段中输入的数据长度。以下是一个例子:

image.png

本示例将ng-minglength设置为5,ng-maxlength设置为12。这意味着,如果输入字段中的文本长度小于5个或超过12个字符,则输入字段中的值将不会复制到$scope.myForm.name属性中。你可以自己试试这个例子,看看会发生什么。

注意显示$scope.myForm.name值的div元素。这将向您展示从文本字段复制到$scope.myForm.name属性的值。注意当文本字段包含少于5个或超过12个字符时,它是如何为空的。

ng模式

ng-pattern指令可用于根据正则表达式验证输入字段的值。以下是一个例子:

<input type="text" id="name" ng-model="myForm.name" ng-pattern="/^\d+$/"> Name <br/>

正则表达式必须遵循JavaScript正则表达式语法。此示例定义了一个正则表达式,该表达式与包含至少1位数字的数字字符串匹配。

ng-必填

ng-required指令检查窗体字段的值是否为空。事实上,您只需使用HTML5的required属性,AngularJS会自动检测它。

检查字段验证状态

如果您给<form>元素一个name属性,那么表单将作为属性添加到$scope对象中。以下是一个例子:

  <form name="myFormNg" ng-submit="myForm.submitTheForm()" >
  ...
  </form>  

当您调用$scope对象上的函数(控制器函数添加到$scope对象的函数)时,您可以通过ngFormController对象的名称访问它,如下所示:

$scope.myFormNg

如果您向窗体内的窗体字段添加name属性,则其ngModelController对象将作为ngFormController对象上的属性访问。以下是一个例子:

  <form name="myFormNg" ng-submit="myForm.submitTheForm()" >
    <input name="firstName" type="text" ng-model="myForm.firstName">
  </form>   

您现在可以像这样访问firstName输入字段的ngModelController

$scope.myFormNg.firstName

ngFormControllerngModelController对象都包含一组属性,这些属性可以判断窗体或输入字段是否有效。这些属性是:

财产描述
$pristine   如果表单没有更改(没有表单字段更改),则返回true;如果更改了某些字段,则返回false。
$dirty$pristine的反面——如果表单没有更改,则为false;如果更改了,则为true。
$valid如果表单字段(或整个表单=所有表单字段)有效,则为真。如果不是,也是假的。
$invalid$valid的反面-如果字段(或表单中的所有字段)有效,则为false;如果字段(或 for中的单个字段)无效,则为真。

您可以使用这些属性在输入字段上设置匹配的CSS类。以下是一个例子:

image.png 注意' input '字段上的' ng-class '指令。该指令使用' myFormNg.name '作为参数调用' myForm.getFormFieldCssClass() '函数。这是' name ' ' input '元素的' ngModelController '。' myForm.getFormFieldCssClass() '只是以字符串形式返回匹配的CSS类

您还可以使用验证属性来显示或隐藏带有验证消息的div元素。以下是之前的表格,添加了div

<div ng-controller="MyController" >
    <form name="myFormNg" ng-submit="myForm.submitTheForm()" novalidate>
    
        <input type="text" ng-class="myForm.getFormFieldCssClass(myFormNg.name)"
               id="name" name="name" ng-model="myForm.name" ng-minlength="2"> Name <br/>

        <div ng-show="myFormNg.name.$invalid">
            You must enter a valid name.
        </div>
    
    </form>
</div>

注意div元素上的ng-show指令。此指令使用myFormNg.name.$invalid验证属性的值来确定是否应该显示div

请记住,您也可以访问ngFormController$pristine$dirty$valid$invalid属性。这些属性包含整个表单的验证状态。如果表单无效,此按钮代码示例将禁用提交按钮:

<button ng-disabled="myFormNg.$invalid">提交表格</button>

提交表格

您可以通过两种方式提交表格:

  • 使用带有ng-click属性的button元素。
  • form元素上使用ng-submit属性(方向)。

在这两种情况下,在$scope对象上调用JavaScript函数。您可以将此JavaScript函数附加到控制器函数中的$scope对象。JavaScript函数应通过AJAX将表单中的数据发送到您的服务器。

以下是在button元素上使用ng-click属性的表单:

image.png

注意ng-click属性如何指向myForm.submitTheForm()函数,并注意submitTheForm()函数如何附加到控制器函数内的$scope对象。

以下是使用ng-submit属性提交表单的相同表单:

image.png

如您所见,这两种机制非常相似。他们都在$scope对象上调用提交函数。