成语| 古诗大全| 扒知识| 扒知识繁体

当前位置:首页 > 趣味生活

angular 表单验证和提交

Q1:详细解读AngularJS中的表单验证编程

需求

Name 必填 Username 非必填,最小长度3,最大长度8 Email 非必填,但必须是合法的email 验证未通过的表单不能提交 显示一个必填或者非法email格式的错误信息 如果正确提交就弹出一个祝贺信息

现在知道我们的目标了吧,让我们一起来构建这个东西吧.

Angular 的表单属性 $valid, $invalid, $pristine, $dirty

Angular 提供了有关表单的属性来帮助我们验证表单. 他们给我们提供了各种有关一个表单及其输入的信息,并且应用到了表单和输入.
属性类
描述

$valid ng-valid Boolean 告诉我们这一项当前基于你设定的规则是否验证通过$invalid ng-invalid Boolean 告诉我们这一项当前基于你设定的规则是否验证未通过$pristine ng-pristine Boolean 如果表单或者输入框没有使用则为True$dirty ng-dirty Boolean 如果表单或者输入框有使用到则为True

Angular 也提供了有关表单及其输入框的类,以便你能够依据每一个状态设置其样式.
访问表单属性

方位表单:
. 访问一个输入框: ..

设置我们的表单

我们将使用一个简单的表单来做演示.

我们将需要两个文件:

index.html 我们用来显示表单的代码 app.js 我们的Angular应用程序和控制器 (几乎没有任何代码)

Our Form Code index.html

<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css"><style>body{ padding-top:30px; }</style><script src="http://code.angularjs.org/1.2.6/angular.js"></script><script src="https://www.bazhishi.com/aldyjtapi/app.js"></script> 成语| 古诗大全| 扒知识| 扒知识繁体 <body ng-app="validationApp" ng-controller="mainController">

这里列出了一些关键点:

novalidate: 它将会组织默认的HTML5验证,因为这会由我们自己来做(我们自己的将会更棒) 我们在输入框上应用了ng-model,以便将来自表单的数据绑定到angular变量 username上的ng-minlength 和 ng-maxlength会自己创建其规则 name 输入框是必填的 email 输入框有属性 type=”email”


验证规则

Angular 有很多验证规则,像是 tong-min leng than dng-max length.

Angular还可以自己配置规则. Angular输入指引上有说明 .

现在建好了表单, 接着创建Angular应用和控制器,ng-app ng-控制器.
应用的 Codeapp.js

// app.js// create angular appvar validationApp = angular.module(validationApp, []);// create angular controllervalidationApp.controller(mainController, function($scope) {// function to submit the form after all validation has occurred$scope.submitForm = function(isValid) {// check to make sure the form is completely validif (isValid) {alert(our form is amazing);}};});


使HTML5验证器的novalidate

我们将在我们的表单使用novalidate。这是一个很好的做法,因为我们将会自己处理验证。如果我们让我们的表单这样做,它看起来很丑陋。

禁用提交按钮 ng-disabled

现在真正的好戏上演了。我们开始使用Angular的属性 。首先让我们禁用我们的提交按钮。如果我们的表单是$invalid的,我们只想禁用它。

......

只使用一点代码(ng-disabled),如果我们的表单是$invalid的,表单按钮将被禁用。
这意味着,我们的name input 字段是必需的,并且email input字段需要一个有效的电子邮件。

用 eng-show显示错误信息

ng-valid 和ng-invalid 会基于提供的表单规则自动验证输入的有效性.

咱们在输入部分加一些错误信息,只要不等于$valid或是已经使用过的就行 (不能展示还没使用).

...

You name is required.

Username is too short.

Username is too long.

Enter a valid email.

...

就像这样 Angular 会根据规则来验证输入部分的$invalid 和 $pristine properties属性从而决定是否显示错误信息.

格局类

Angular在验证输入或表单时的有效有否是已经提供了一些类,像是 (ng-valid,ng-invalid,ng-pristineandng-dirty).

你可以编辑自己喜欢的CSS . 你可以私有定制化这些类来实现特定的场景应用.

.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{ }

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

因为我们使用了 Bootstrap, 我们将就使用它们提供的类(has-error). 这样就能围绕我们的form-group获得漂亮的错误信息和颜色.

ng-class 允许我们基于一个表达式添加类. 在这种情况下,我们想要想我们的form-group添加一个 has-error 类,如果输入框的状态是$invalid或者不是pristine的话.

其工作的方式是 ng-class="{ : }". 更多的信息,请读一读 Angular ngClass 文档吧.

...

You name is required.

Username is too short.

Username is too long.

Enter a valid email.

...

现在我们的表单就有了恰当的Bootstrap错误类.

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

有时候不想在用户正在输入的时候显示错误信息. 当前错误信息会在用户输入表单时立即显示. 由于Angular很棒的数据绑定特性,这是可以发生的. 因为所有的事务都可以在一瞬间发生改变,这在表单验证时会有副作用.

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

你要去掉提交按钮上的ng-disabled,因为我们想要用户即使是在表单没有全部验证完的情况下也能点击提交. 你要在表单已经被提交之后添加一个变量. 在你的 submitForm() 函数中, 只要加入 $scope.submitted = true 就行了;. 一旦表单被提交,它就会保存提交值为true的submitted变量. 将错误规则从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的指令.

我们正在写一篇文章专门讨论此话题。同时,还有其他的一些资源讨论了创建custom指令来处理失去焦点的情况:

http://coding-issues.blogspot.in/2013/10/angularjs-blur-directive.html http://blog.ejci.net/2013/08/06/dealing-with-focus-and-blur-in-angularjs-directives/ http://plnkr.co/edit/Xfr7X6JXPhY9lFL3hnOw?p=preview

全部完成

现在一旦我们正确填写了所有的信息,我们的表单提交按钮就能使用了. 一旦我们提交了表单,我们将会见到我们设置的弹出消息.

用了几行我们就可以:

进行输入框验证 显示表单错误消息 定制样式类 自动禁止和启用表单 定制规则

如你所见,我们使用了Angular内置的表单验证技术来创建一个客户端验证表单.

www∽.BAZHISHI.cOm

Q2:vue 表单验证和angular表单验证哪个好

在 table 外面 加一对 form 标签 里面有属性 action 是你要提交到的地址 method 是你提交方式 就2中 get 和 post 你把上面写的 javascript 脚本 都让他返回 boolean 型的变量 在 form 标签里 调用 OnSubmit 事件 调用 脚本 再提交前判断 是否符合提交

Q3:AngularJS使用angular-formly进行表单验证

当验证表单中有很多字段时,这时候可能希望把html的生成以及验证逻辑放到controller中,在页面,也许是这样的:

然后,在controller中定义各个字段以及验证。angular-formly就是为这个需求而存在。

在controller中,把各个字段定义在数组中:

vm.rentalFields = [{key:first_name,type:input,templateOptions:{type:text,label:姓,placeholder: 输入姓,required: true}},...]

使用hideExpression字段定义隐藏的条件:

{key:under18,type:checkbox,templateOptions:{label:是否不满18岁},hideExpression: !model.email //email验证失败之前不显示}

使用validators字段自定义验证规则:

{key:license,type:input,templateOptions:{label:身份证号,placeholder:输入身份证号},hideExpression: !model.province,validators:{driversLicense: function($viewValue, $modelValue, scope){var value = https://www.bazhishi.com/aldyjtapi/$modelValue$viewValue;if(value){return validateDriversLicence(value);}},expressionProperties:{templateOptions.disabled:function($viewValue, $modelValue, scope){if(scope.model.province == 山东省){return false;}return true;}}}

首先安装:npm install angular-formly angular-formly-templates-bootstrap bootstrap api-check

Demo的文件结构:

css/
.....style.css
node_modules/
scripts/
.....MainController.js
.....provinces.js [提供select的选项,有关省]

app.js

index.html

index.html

<meta charset="gb2312"><link rel="stylesheet" href="https://www.bazhishi.com/aldyjtapi/css/style.css"/><link rel="stylesheet" href="https://www.bazhishi.com/aldyjtapi/node_modules/bootstrap/dist/css/bootstrap.min.css"/> 成语| 古诗大全| 扒知识| 扒知识繁体 <body ng-app="formlyApp" ng-controller="MainController as vm">
<script src="https://www.bazhishi.com/aldyjtapi/node_modules/api-check/dist/api-check.js"></script><script src="https://www.bazhishi.com/aldyjtapi/node_modules/angular/angular.min.js"></script><script src="https://www.bazhishi.com/aldyjtapi/node_modules/angular-formly/dist/formly.js"></script><script src="https://www.bazhishi.com/aldyjtapi/node_modules/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.min.js"></script><script src="https://www.bazhishi.com/aldyjtapi/app.js"></script><script src="https://www.bazhishi.com/aldyjtapi/scripts/MainController.js"></script><script src="https://www.bazhishi.com/aldyjtapi/scripts/province.js"></script>

app.js

(function(){use strict;angular.module(formlyApp,[formly,formlyBootstrap])})();

province.js

以factory的方式返回一个对象,包含获取select选项的方法。

(function(){use strict;

angular

.module(formlyApp).factory(province, province);function province(){function getProvinces(){return [{"name":"山东省","value":"山东省"},{"name":"江苏省","value":"江苏省"}];}return {getProvinces:getProvinces}}})();

MainController.js

(function(){use strict;angular.module(formlyApp).controller(MainController, MainController);function MainController(province){var vm = this;vm.rental = {};vm.rentalFields = [{key:first_name,type:input,templateOptions:{type:text,label:姓,placeholder: 输入姓,required: true}},{key:last_name,type:input,templateOptions:{type:text,label:名,placeholder:输入名,required:true}},{key:email,type:input,templateOptions:{type:email,label:邮箱,placeholder:输入邮箱,required:true}},{key:under18,type:checkbox,templateOptions:{label:是否不满18岁},hideExpression: !model.email //email验证失败之前不显示},{key: province,type:select,templateOptions:{label:选择省,options: province.getProvinces()},hideExpression: !model.email},{key:license,type:input,templateOptions:{label:身份证号,placeholder:输入身份证号},hideExpression: !model.province,validators:{driversLicense: function($viewValue, $modelValue, scope){var value = https://www.bazhishi.com/aldyjtapi/$modelValue$viewValue;if(value){return validateDriversLicence(value);}},expressionProperties:{templateOptions.disabled:function($viewValue, $modelValue, scope){if(scope.model.province == 山东省){return false;}return true;}}}},{key: insurance,type: input,templateOptions:{label:保险,placeholder:输入保险},hideExpression: !model.under18!model.province}];function validateDriversLicence(value) {return /[A-Za-z]\d{4}[\s|\-]*\d{5}[\s|\-]*\d{5}$/.test(value);}}})();

以上内容是小编给大家分享的AngularJS使用angular-formly进行表单验证的全部叙述,希望大家喜欢。

猜你喜欢

更多