angularjs的表单验证问题

angularjs表单验证问题

1 可以使用angularjs自带验证,(必填项、email、url)使用方法:

通过myForm.personEmail.$valid是否为true 即可判断是否通过验证。具体是哪类错误可以通过demo:
<input type="text" required />  必填
<input type="text" ng-minlength="5" /> 最小长度
<input type="text" ng-maxlength="20" />最大长度
<input type="text" ng-pattern="/[a-zA-Z]/" /> 正则表达式
<input type="email" name="email" ng-model="user.email" /> 电子邮件
<input type="number" name="age" ng-model="user.age" /> 数字
<input type="url" name="homepage" ng-model="user.facebook_url" />url
myForm.personEmail.$error错误信息的显示demo:
<form name="myForm">
  <input name="personEmail" required type="email" ng-model="person.email"/>
  <span ng-show="!myForm.personEmail.$valid">有错</span>
  <span ng-show="myForm.personEmail.$error.required">必填</span>
  <span ng-show="myform.personEmail.$error.email">email 地址不对</span>
<input type="submit" ng-disabled="myForm.$invalid"/>用来阻止表单提交操作</form>

屏蔽浏览器对表单的默认验证行为:表单元素上添加novalidate标记

使用formName.inputFieldName.property的格式访问angularjs表单验证相关属性。
formName.inputFieldName.$pristine;表示用户是否修改了表单,没修改过true。
formName.inputFieldName.$dirty;修改过为true
formName.inputFieldName.$valid;经过验证为true
formName.inputFieldName.$invalid;未经过验证为true
可以通过这些类设置特定的样式:

.ng-valid { }
.ng-invalid { }
.ng-pristine { }
.ng-dirty { }
/* really specific css rules applied by angular */
.ng-invalid-required { }
.ng-invalid-minlength { }
.ng-valid-max-length { }

2,除了使用angularjs自带的验证外,可以使用模式匹配的方式(正则表达式)解决这几种情况,也可以自定义验证指令来复写或者重定义验证规则。demo:

angular.module("myTest", [])
.directive(‘multipleEmail‘, [function () {
return {
require: "ngModel",
link: function (scope, element, attr, ngModel) {
if (ngModel) {
var emailsRegexp = /^([a-z0-9!#$%&‘*+\/=?^_`{|}~.-][email protected][a-z0-9-]+(\.[a-z0-9-]+)*[;;]?)+$/i;
}
var customValidator = function (value) {
var validity = ngModel.$isEmpty(value) || emailsRegexp.test(value);
ngModel.$setValidity("multipleEmail", validity);
return validity ? value : undefined;
};
ngModel.$formatters.push(customValidator);
ngModel.$parsers.push(customValidator);
}
};
}])

<form class="form-horizontal" role="form" id="custom_form" name="custom_form" novalidate>
<div class="form-group">
<label class="col-sm-2 control-label">多个email</label>

<div class="col-sm-10">
<input multiple-email name="user_email" ng-model="user.email" required class="form-control" placeholder="自定义验证,多个邮箱地址,以“;”或者“;”分割" />
验证通过:{{custom_form.user_email.$valid}}
</div>
</div>
<div class="form-group text-center">
<input class="btn btn-primary btn-lg" ng-disabled="custom_form.$invalid" type="submit" value="提交" />
</div>
</form>

传入的指令中的ng-model的属性:

$viewValue属性保存着更新视图所需的实际字符串。

$modelValue由数据模型的值。$modelValue和$viewValue可能是不同的,取决于$parser流水线是否对其进行了操作。

$parsers的值是一个由函数组成的数组,当用户同控制器进行交互,并且ngModelController中的$setViewValue()方法被调会以流水线的形式被逐一调用,ngModel从DOM中读取的值会被传入$parsers中的函数,并依次被其中的解析器处理。

备注:ngModel.$setViewValue()函数用于设置作用域中的视图值。

ngModel.$set ViewValue()函数可以接受一个参数。

value(字符串):value参数是我们想要赋值给ngModel实例的实际值。

$formatters的值是一个由函数组成的数组,其中的函数会以流水线的形式在数据模型的值发生变化时被逐一调用。它和$parser流水线互不影响,用来对值进行格式化和转换,以便在绑定了这个值的控件中显示。$viewChangeListeners的值是一个由函数组成的数组,其中的函数会以流水线的形式在视图中的值发生变化时被逐一调用。通过$viewChangeListeners,可以在无需使用$watch的情况下实现类似的行为。由于返回值会被忽略,因此这些函数不需要返回值。

使用 ng-class 根据条件添加类

ng-class 允许我们基于一个表达式添加类. 在这种情况下,我们想要想我们的form-group添加一个 has-error 类,如果输入框的状态是$invalid或者不是pristine的话.其工作的方式是 ng-class="{ <class-you-want> : <expression to be evaluated > }". demo:

<!-- NAME -->

    <div class="form-group" ng-class="{ ‘has-error‘ : userForm.name.$invalid && !userForm.name.$pristine }">

        <label>Name</label>

        <input type="text" name="name" class="form-control" ng-model="user.name" required>

        <p ng-show="userForm.name.$invalid && !userForm.name.$pristine" class="help-block">You name is required.</p>

    </div>

    

    <!-- USERNAME -->

    <div class="form-group" ng-class="{ ‘has-error‘ : userForm.username.$invalid && !userForm.username.$pristine }">

        <label>Username</label>

        <input type="text" name="username" class="form-control" ng-model="user.username" ng-minlength="3" ng-maxlength="8">

        <p ng-show="userForm.username.$error.minlength" class="help-block">Username is too short.</p>

        <p ng-show="userForm.username.$error.maxlength" class="help-block">Username is too long.</p>

    </div>

        

    <!-- EMAIL -->

    <div class="form-group" ng-class="{ ‘has-error‘ : userForm.email.$invalid && !userForm.email.$pristine }">

        <label>Email</label>

        <input type="email" name="email" class="form-control" ng-model="user.email">

        <p ng-show="userForm.email.$invalid && !userForm.email.$pristine" class="help-block">Enter a valid email.</p>

    </div>

只在提交表单后显示错误信息

对于你想要只在表单正要提交之后才显示错误消息的场景, 你就需要对上面的代码做一些小调整.

  1. 你要去掉提交按钮上的ng-disabled,因为我们想要用户即使是在表单没有全部验证完的情况下也能点击提交.
  2. 你要在表单已经被提交之后添加一个变量. 在你的 submitForm() 函数中, 只要加入 $scope.submitted = true 就行了;. 一旦表单被提交,它就会保存提交值为true的submitted变量.
  3. 将错误规则从ng-class="{ ‘has-error‘ : userForm.name.$invalid && !userForm.name.$pristine }" 调整为 ng-class="{ ‘has-error‘ : userForm.name.$invalid && !userForm.name.$pristine && submitted }". 这就确保了错误消息只会在表单被提交时被显示出来. 你也许会需要为这个变量调整所有其它的 ng-class 和 ng-show.

现在,只有在submitted变量被设置为true时才会显示错误信息.

只有在输入框之外点击时才显示错误消息

只有在输入框之外点击时才显示错误消息(也被叫做失去焦点 blur) 这一需求比在提交时验证要复杂一点. 在失去焦点时验证表单需要一个custom指令. 这是一个可以让你操作DOM的指令.

时间: 2024-10-13 02:30:52

angularjs的表单验证问题的相关文章

基于angularJS的表单验证练习

今天看了一下angularJS的表单验证,看的有点云里雾里(也有可能是雾霾吸多了),于是做了一个小练习来巩固一下. html: <div ng-controller="Aaa"> <form novalidate name="loginForm"> <div> <label>用户名</label> <input type="text" name="nText"

AngularJS复习------表单验证

在AngularJS中能够将HTML5表单验证功能同自己的验证指令结合起来使用,这里介绍使用的核心功能. 使用表单验证,首先要确保表单的每个控件都有name属性 如果想要屏蔽浏览器对表单的默认验证行为,可以在表单元素上添加novalidate标记. 必填项:只需要在输入字段元素上添加HTML5标记 required即可 最小长度:在输入字段上使用AngularJS指令ng-minlength="{number}" 最大长度:在输入字段上使用AngularJS指令ng-maxlength

angularJS 过滤器 表单验证

过滤器1.filter的作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果,主要用于数据的格式化.2.内置过滤器(1)Currency(货币)将一个数值格式化为货币格式,默认为$(2)Date(3)Filter子串匹配用来处理一个数组,可以过滤出含有某个子串的元素,作为一个字数组来返回.通常用来过滤需要展示的元素.可以是字符串数字,对象或是一个用来从数组中选择元素的函数.字符串:返回所有包含这个字符串的元素对象:将待过滤对象的属性同这个对象中的同名属性进行对比,如果属性值是字符串就

AngularJs的表单验证

能够根据用户在表单中输入的内容给出实时视觉反馈是非常重要的.在人与人沟通的语境中,表单验证给出来的反馈同获得正确输入同等重要. 如果想要屏蔽浏览器对表单的默认验证行为,可以在表单元素上添加novalidate标记. <form name="form" novalidate><label name="email">Your email</label><input type="email"name="

AngularJS 的表单验证

最近开始学习angularjs,学到表单验证的时候发现有必要学习下大神的好文章: 转:http://www.oschina.net/translate/angularjs-form-validation 今天我们将来看看Angular如何帮助做表单验证. 我们将讨论更多使用angular进行有关表单操作的东西(就像我们另外的一篇文章: 提交Ajax表单:AngularJS的方式). 不过不用担心,那篇文章不一定要读的. 我们将重点放在客户端验证上,并使用Angular内置的表单属性.这里有一个 

【AngularJs】---表单验证

1. 必填项 验证某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required /> 2. 最小长度验证表单输入的文本长度是否大于某个最小值,在输入字段上使用AngularJS指令 ng-minleng= "{number}": <input type="text" ng-minlength="5" /> 3. 最大长度验证

AngularJs实现表单验证

首先,我们应该知道,表单中,常用的验证操作有: $dirty 表单有填写记录 $valid 字段内容合法的 $invalid 字段内容是非法的 $pristine 表单没有填写记录 $error 表单验证不通过的错误信息, $error支持的验证有:required/minlength/maxlength/pattern/email/number/date/url等 然后,验证时,需给表单,及需要验证的input,设置name属性:给form及input设置name后,会将form表单信息,默认

AngularJS之表单验证

<body ng-app="myApp" ng-controller="MoinController"> <style> .error { border: 1px solid red!important; } </style> <form name="signUpForm" ng-submit="submitForm()"> <div class="form-gr

AngularJS form表单验证(非常全面)

构建一个ng表单 novalidate=”novalidate” 2.form中不能有action属性.提交交由ng-submit处理 3.每个input一定要有ng-model,最好有一个name方便引用.然后用require或者ng-minlength之类才起作用 <form name="form" novalidate="novalidate"> <label name="email">Your email</