`

AngularJS动态校验

阅读更多

        在Angular实际开发中,我们遇到查询数据,用ng-repeat循环在前台页面展示,而ng-repeat中的内容又需要独立操作,且需对每个ng-repeat中的区域中的输入框进行修改保存,且每个ng-repeat区域都需要校验,此时我们发现校验失效了。

        遇到此问题时,当时第一反应是有两处原因,一处是由于ng-repeat中的内容是动态编译出来的,可能是作用域问题导致;另一处是由于我们的校验是通过form来实现的,动态form失效了。

        因此,特做了如下小实例进行了验证,发现问题出在动态Form的校验没生效。

        首先,让我们来看下动态编译实例:

formValidationTest.html

<html>
<head>
	<title>表单验证</title> 
	<!-- 
	<link href="lib/bootstrap-gh-pages/assets/bootstrap.css" rel="stylesheet" type="text/css" />
	-->
	<link rel="stylesheet" href="lib/bootstrap-3.0.0/css/bootstrap.css">
	<style> 
     #css_form input.ng-invalid.ng-dirty {
          background-color: #FFC0CB;
     }
     #css_form input.ng-valid.ng-dirty {
          background-color: #78FA89;
     }
	</style>
</head>
<body ng-controller="myCtrl">
	<div class="panel panel-primary">
        <div class="panel-heading">
            <div class="panel-title">表单验证</div>
        </div>
        <div class="panel-body">
			<div class="row">
					<div inner-content>
					</div>
			</div>
		</div>
	</div>
	<script type='text/javascript' src='lib/angular/angular.js'></script>
	<script type='text/javascript' src='lib/bootstrap-gh-pages/ui-bootstrap-tpls-0.10.0.js'></script>
	<script type='text/javascript' src='app.js'></script>
	<script type='text/javascript' src='directive.js'></script>
</body>
</html>

subPage.html

<form  id="css_form" class="form-horizontal" novalidate name="myform" role="form">
<div class="form-group">
   <label for="inputAccount" class="col-md-2 control-label">账号:</label>
   <div class="col-md-2">
   	<!--输入框 -->
   	<input type="number"  ng-model="user.account" min="3" max="6"  name="myAccount" required class="form-control" id="inputAccount" placeholder="请输入3-6的整数"/>
   </div>
   <!-- 隐藏块,显示验证信息--> 
   <div class="alert alert-danger well-sm" ng-show="myform.myAccount.$error.required">账号不能为空!</div>
   <div class="alert alert-danger well-sm" ng-show="myform.myAccount.$error.min || myform.myAccount.$error.max">输入值必须在3-6之间!</div>
</div>

<div class="form-group">
   <label for="inputEmail" class="col-md-2 control-label">邮箱:</label>
   <div class="col-md-2">
   	<!--输入框 -->
   	<input type="email" ng-model="user.email" name="myEmail" required class="form-control" id="inputEmail" placeholder="请输入邮箱地址"/>
   </div>
   <!-- 隐藏块,显示验证信息--> 
   <div class="alert alert-danger well-sm" ng-show="myform.myEmail.$error.required">邮箱不能为空!</div>
   <div class="alert alert-danger well-sm" ng-show="myform.myEmail.$error.email">邮箱格式不正确!</div>
</div>

<!--按钮组-->
<div class="form-group">
 <div class="col-md-offset-2 col-md-10">
    <button class="btn btn-default"  ng-disabled="!myform.$valid">提交</button>
    <button class="btn btn-default" ng-click="reset(user)">重置</button>
 </div>
</div>
</form>

app.js

var myApp=angular.module('myModule', ['ui.bootstrap','directives']);
myApp.controller('myCtrl',function($scope){
		$scope.user ={id:1, account:undefined, email:undefined};
	
    $scope.reset=function(user){ //表单重置
         user.account = '';
         user.email = '';
    };
});
angular.element(document).ready(function() {   
 angular.bootstrap(document,['myModule']);  
});

directive.js

'use strict';

/* Directives */
var directivesModule = angular.module( "directives", [] );

directivesModule.directive("innerContent", ['$http','$compile', function($http, $compile) {
    return {
        restrict: "A",
        scope: false,
        link: function(scope, element, attrs) {
					var initTpl = function (){
						$http.get('subPage.html').success(function(response) { 
							element.html(response);
							$compile(element, false, 0)(scope);
						});
					};
					initTpl();
				},
		    replace: true
    };
}]);

在FireFox运行效果:

        校验生效,说明动态编译对校验是不影响的。修改subPage.html如下:

<form  id="css_form" class="form-horizontal" novalidate name="myform_{{user.id}}" role="form">
	<div class="form-group">
	   <label for="inputAccount" class="col-md-2 control-label">账号:</label>
	   <div class="col-md-2">
	   	<!--输入框 -->
	   	<input type="number"  ng-model="user.account" min="3" max="6"  name="myAccount" required class="form-control" id="inputAccount" placeholder="请输入3-6的整数"/>
	   </div>
	   <!-- 隐藏块,显示验证信息--> 
	   <div class="alert alert-danger well-sm" ng-show="myform_{{user.id}}.myAccount.$error.required">账号不能为空!</div>
	   <div class="alert alert-danger well-sm" ng-show="myform_{{user.id}}.myAccount.$error.min || myform_{{user.id}}.myAccount.$error.max">输入值必须在3-6之间!</div>
	</div>
	
	<div class="form-group">
	   <label for="inputEmail" class="col-md-2 control-label">邮箱:</label>
	   <div class="col-md-2">
	   	<!--输入框 -->
	   	<input type="email" ng-model="user.email" name="myEmail" required class="form-control" id="inputEmail" placeholder="请输入邮箱地址"/>
	   </div>
	   <!-- 隐藏块,显示验证信息--> 
	   <div class="alert alert-danger well-sm" ng-show="myform_{{user.id}}.myEmail.$error.required">邮箱不能为空!</div>
	   <div class="alert alert-danger well-sm" ng-show="myform_{{user.id}}.myEmail.$error.email">邮箱格式不正确!</div>
	</div>
	
	<!--按钮组-->
	<div class="form-group">
	 <div class="col-md-offset-2 col-md-10">
	    <button class="btn btn-default"  ng-disabled="!myform_{{user.id}}.$valid">提交</button>
	    <button class="btn btn-default" ng-click="reset(user)">重置</button>
	 </div>
	</div>
</form>

app.js

var myApp=angular.module('myModule', ['ui.bootstrap','directives']);
myApp.controller('myCtrl',function($scope){
		$scope.user ={id:1, account:undefined, email:'baa@126.com'};
	
    $scope.reset=function(user){ //表单重置
         user.account = '';
         user.email = '';
    };
});
angular.element(document).ready(function() {   
 angular.bootstrap(document,['myModule']);  
});

在FireFox中运行效果:

        发现校验失效了,因此确定是动态form原因造成的。且邮箱输入框能正常显示模型数据,说明双向绑定也是OK的。

  • 大小: 7.6 KB
  • 大小: 5.5 KB
分享到:
评论

相关推荐

    AngularJs表单校验实例

    AngularJS 是一个强大的前端JavaScript框架,它提供了一种高效的方式来构建动态、数据驱动的Web应用。在AngularJS中,表单验证是确保用户输入数据有效性和完整性的关键机制。这篇博文将深入探讨如何在AngularJS中...

    AngularJs表单校验功能实例代码

    AngularJs在处理表单和表单校验方面提供了丰富的API和指令。 在AngularJs中,表单校验功能是通过内置的验证指令实现的,例如`required`, `ng-minlength`, `ng-maxlength`, `pattern`等。此外,AngularJs还提供了...

    ng-remote-validate, Ajax &服务器端对Angularjs的验证.zip

    ng-remote-validate, Ajax &服务器端对Angularjs的验证 Angularjs#的#Ajax 验证ngRemoveValidate使你可以轻松地从服务器验证表单域代理数据。 例如注册表单可能需要在提交表单前检查输入的电子邮件是否已经注册。...

    angularjs自定义正则表达校验指令directive

    总之,AngularJS自定义指令为我们提供了强大的能力,用于创建复杂的表单校验逻辑。通过结合正则表达式,我们可以轻松地实现http链接、纯数字等格式的验证,提升应用的用户体验。在实际项目中,可以根据需求不断扩展...

    使用angularJS完成表单验证

    使用angularJS完成表单验证功能

    AngularJS身份验证的方法

    通过这种方式,AngularJS应用能够根据用户的角色权限来动态地显示或隐藏页面内容、控制页面路由访问,以及在HTTP请求层面上进行权限校验,从而实现一个完整的身份验证机制。这种机制在提高用户体验的同时,确保了...

    AngularJS入门教程之表单校验用法示例

    5. 显示校验信息:AngularJS支持动态地根据校验状态改变元素样式,并通过`ng-messages`指令显示具体的错误信息,为用户提供直观的反馈。 以文章中的案例代码为例,展示了一个具体的表单校验实现。在这个示例中,...

    angularjs自定义指令directive正则表达校验

    总结,AngularJS自定义指令为我们提供了一种灵活的方式,通过结合正则表达式,可以在前端实现高效的数据校验,提高用户体验并减少服务器端的负担。通过以上示例,你可以了解到如何创建和使用自定义指令进行HTTP地址...

    AngularJS实现表单手动验证和表单自动验证

    在探讨AngularJS框架中的表单验证时,我们首先要认识到AngularJS为开发者提供了一套强大的表单处理机制,这包括了手动验证和自动验证两种方式。手动验证主要是利用AngularJS提供的指令和API来实现的,而自动验证则...

    Angularjs使用指令做表单校验的方法

    Angularjs 是一个非常流行的前端JavaScript框架,主要用于构建动态Web应用。在Web开发中,表单校验是提升用户体验的重要环节之一。Angularjs 提供了内置指令来支持表单验证,而本篇文章则着重介绍如何使用Angularjs...

    图案锁 angularjs

    AngularJS是由Google开发的一个强大的前端JavaScript框架,它主要用于构建动态Web应用。其核心特性包括双向数据绑定、依赖注入、模块化以及丰富的指令系统。在这个"图案锁 angularjs"项目中,我们将会看到AngularJS...

    AngularJS UI Development

    - **表单验证**:AngularJS内置了表单验证功能,可以很方便地对用户的输入进行校验。例如,使用`ng-required`、`ng-minlength`等属性来设置表单字段的验证规则。 - **服务与工厂**:AngularJS的服务和工厂用于封装可...

    angularjs-1.2.0.zip

    这个版本引入了许多新特性,优化了性能,增强了对移动设备的支持,同时也修复了大量的bug,使得开发者能够更高效地构建动态、响应式的Web应用。 AngularJS的核心特性包括双向数据绑定、依赖注入、指令系统和模块化...

    AngularJS表单和输入验证实例

    - 验证消息:可以使用`ng-show`和`ng-hide`指令来根据控件的状态动态显示或隐藏验证错误消息。 4. 视图与控制器交互: - 在控制器中可以定义方法来处理表单的提交(如`$scope.submitForm`)。 - 使用`$scope....

    AngularJS表单基础

    AngularJS的表单处理机制涵盖了从基本的输入校验到复杂的状态管理,还包括了针对不同状态的动态样式应用,以及对原生表单行为的兼容。通过学习AngularJS的表单基础,开发者能够创建出更加健壮、易于维护的Web应用...

Global site tag (gtag.js) - Google Analytics