angular的 表单

一般来讲表单可能遇到的问题:
1.如何数据绑定。
2.验证表单。
3.显示出错信息。
4.整个form的验证。
5.避免提交没有验证通过的表单。
6.防止多系提交。

input属性:
name
ng-model
ng-required
ng-minlength
ng-maxlength
ng-pattern
ng-change值变化时的回调

{{myForm.username.$error}}

Form控制变量
字段是否未更改
formName.inputFieldName.$pristine
字段是否更改
formName.inputFieldName.$dirty
字段有效
formName.inputFieldName.$valid
字段无效
formName.inputFieldName.$invalid
字段错误信息
formName.inputfieldName.$error

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="../../vendor/bootstrap3/css/bootstrap.min.css"/>
</head>
<body>
<div ng-app="myApp" style="margin-top: 100px;">

    <form name="myForm" action="kittencup.php" ng-controller="firstController" class="container form-horizontal">
        <div class="form-group" ng-class="{‘has-error‘:myForm.username.$dirty && myForm.username.$invalid}">
            <label class="col-sm-2 control-label">用户名</label>
            <div class="col-sm-10">
                <input type="text" autocomplete="off" name="username" ng-pattern="/^[a-zA-Z]{1}/" ng-required="true" ng-minlength="5" ng-maxlength="10" ng-model="data.username" class="form-control" placeholder="用户名">
                <div ng-show="myForm.username.$dirty && myForm.username.$error.maxlength" class="alert alert-danger help-block">
                    用户名长度不能超过10位
                </div>
                <div ng-show="myForm.username.$dirty && myForm.username.$error.minlength" class="alert alert-danger help-block">
                    用户名长度不能小于5位
                </div>
                <div ng-show="myForm.username.$dirty && myForm.username.$error.pattern" class="alert alert-danger help-block">
                    用户名必须已英文字母开始
                </div>
            </div>
        </div>

        <div class="form-group" ng-class="{‘has-error‘:myForm.password.$dirty && myForm.password.$invalid}">
            <label class="col-sm-2 control-label">密 码</label>
            <div class="col-sm-10">
                <input type="password" autocomplete="off" name="password" ng-required="true" ng-minlength="5" ng-maxlength="10" ng-model="data.password" class="form-control" placeholder="密码">
                <div ng-show="myForm.password.$dirty && myForm.password.$error.maxlength" class="alert alert-danger help-block">
                    密码长度不能超过10位
                </div>
                <div ng-show="myForm.password.$dirty && myForm.password.$error.minlength" class="alert alert-danger help-block">
                    密码长度不能小于5位
                </div>
            </div>
        </div>

        <div class="form-group" ng-class="{‘has-error‘:myForm.passwordConfirm.$dirty && myForm.passwordConfirm.$invalid}">
            <label class="col-sm-2 control-label">确认密码</label>
            <div class="col-sm-10">
                <input type="password" autocomplete="off" name="passwordConfirm" ng-required="true" ng-model="data.passwordConfirm" class="form-control" placeholder="确认密码">
                <div ng-show="myForm.password.$dirty && myForm.passwordConfirm.$dirty && data.password !== data.passwordConfirm" class="alert alert-danger help-block">
                    密码和确认密码不一致
                </div>
            </div>
        </div>

        <div class="form-group" ng-class="{‘has-error‘:myForm.email.$dirty && myForm.email.$invalid}">
            <label class="col-sm-2 control-label">邮箱</label>
            <div class="col-sm-10">
                <input type="email" autocomplete="off" name="email" ng-required="true" ng-minlength="5" ng-maxlength="30" ng-model="data.email" class="form-control" placeholder="邮箱">
                <div ng-show="myForm.email.$dirty && myForm.email.$error.maxlength" class="alert alert-danger help-block">
                    邮箱长度不能超过30位
                </div>
                <div ng-show="myForm.email.$dirty && myForm.email.$error.minlength" class="alert alert-danger help-block">
                    邮箱长度不能小于5位
                </div>
                <div ng-show="myForm.email.$dirty && myForm.email.$error.email" class="alert alert-danger help-block">
                    邮箱格式不正确
                </div>
            </div>
        </div>

        <div class="form-group" ng-class="{‘has-error‘:myForm.blog.$dirty && myForm.blog.$invalid}">
            <label class="col-sm-2 control-label">博客网址</label>
            <div class="col-sm-10">
                <input type="url" autocomplete="off" name="blog" ng-required="true" ng-minlength="5" ng-maxlength="30" ng-model="data.blog" class="form-control" placeholder="博客网址">
                <div ng-show="myForm.blog.$dirty && myForm.blog.$error.maxlength" class="alert alert-danger help-block">
                    网址长度不能超过30位
                </div>
                <div ng-show="myForm.blog.$dirty && myForm.blog.$error.minlength" class="alert alert-danger help-block">
                    网址长度不能小于5位
                </div>
                <div ng-show="myForm.blog.$dirty && myForm.blog.$error.url" class="alert alert-danger help-block">
                    网址格式不正确
                </div>
            </div>
        </div>

        <div class="form-group" ng-class="{‘has-error‘:myForm.age.$dirty && myForm.age.$invalid}">
            <label class="col-sm-2 control-label">年龄</label>
            <div class="col-sm-10">
                <input type="number" autocomplete="off" name="age" min="10" max="99" ng-required="true" ng-model="data.age" class="form-control" placeholder="年龄">
                <div ng-show="myForm.age.$dirty && myForm.age.$error.max" class="alert alert-danger help-block">
                    年龄不能超过99岁
                </div>
                <div ng-show="myForm.age.$dirty && myForm.age.$error.min" class="alert alert-danger help-block">
                    年龄不能小于10岁
                </div>
            </div>
        </div>

        <div class="form-group">
            <label class="col-sm-2 control-label">性别</label>
            <div class="col-sm-10">
                <label class="radio-inline">
                    <input type="radio" ng-required="true" name="sex" ng-model="data.sex" value="1" /> 男
                </label>
                <label class="radio-inline">
                    <input type="radio" ng-required="true" name="sex" ng-model="data.sex" value="0" /> 女
                </label>
            </div>
        </div>

        <div class="form-group">
            <label class="col-sm-2 control-label">爱好</label>
            <div class="col-sm-10">
                <label class="checkbox-inline" ng-repeat="hobby in hobbies">
                    <input type="checkbox" ng-model="hobby.checked" name="hobby[]" ng-checked="data.hobbies === undefined ? false : data.hobbies.indexOf(hobby.id) !== -1" ng-click="toggleHobbySelection(hobby.id)"/> {{hobby.name}}
                </label>
            </div>
        </div>

        <div class="form-group">
            <label class="col-sm-2 control-label">出生地</label>
            <div class="col-sm-3">
                <select class="form-control" ng-change="data.area = false" ng-model="data.province" ng-options="x.id as x.name for x in cities | cityFilter:0"></select>
            </div>
            <div class="col-sm-3">
                <select class="form-control" ng-show="data.province" ng-model="data.area" ng-options="x.id as x.name for x in cities | cityFilter:data.province"></select>
            </div>
            <div class="col-sm-3">
                <select class="form-control" ng-required="true" ng-show="data.province && data.area" ng-model="data.city" ng-options="x.id as x.name for x in cities | cityFilter:data.area"></select>
            </div>
        </div>

        <div class="form-group">
            <label class="col-sm-2 control-label">只能输入偶数</label>
            <div class="col-sm-10">
               <input type="text" name="even" class="form-group" placeholder="偶数" ng-model="data.even" even>
                <div ng-show="myForm.even.$error.even" class="alert alert-danger help-block">
                    数字必须是偶数
                </div>
            </div>
        </div>

        <div class="form-group">
            <label class="col-sm-2 control-label">个人介绍</label>
            <div class="col-sm-10">
                <custom-text-area ng-model="data.introduct">aaa</custom-text-area>
                <custom-text-area ng-model="data.introduct"></custom-text-area>
            </div>
        </div>

        <div class="form-group">
           <div class="col-sm-offset-2 col-sm-10">
               <button type="submit" class="btn btn-default" ng-disabled="myForm.$invalid || data.hobbies === undefined || data.hobbies.length === 0">注册</button>
               <button type="reset" class="btn btn-default" ng-click="reset()">重置</button>
           </div>

        </div>

    </form>

</div>

<script type="text/javascript" src="../../vendor/angular/angularjs.js"></script>
<script type="text/javascript" src="app/index.js"></script>

</body>
</html>
angular.module(‘myApp‘, [])

    .filter(‘cityFilter‘, function () {
        return function (data, parent) {
            var filterData = [];
            angular.forEach(data, function (obj) {
                if (obj.parent === parent) {
                    filterData.push(obj);
                }
            })

            return filterData;
        }
    })

    .directive(‘even‘,function(){
        return {
            require : ‘ngModel‘,
            link:function(scope,elm,attrs,ngModelController){
                ngModelController.$parsers.push(function(viewValue){
                    if(viewValue % 2 === 0){
                        ngModelController.$setValidity(‘even‘,true);
                    }else{
                        ngModelController.$setValidity(‘even‘,false);
                    }
                    return viewValue;
                });

//                ngModelController.$formatters.push(function(modelValue){
//                    return modelValue + ‘kittencup‘;
//                })
            }
        };
    })

    .directive(‘customTextArea‘,function(){
        return {
            restrict:‘E‘,
            template:‘<div contenteditable="true"></div>‘,
            replace:true,
            require : ‘ngModel‘,
            link:function(scope,elm,attrs,ngModelController){

                // view->model
                elm.on(‘keyup‘,function(){
                    scope.$apply(function(){
                        ngModelController.$setViewValue(elm.html());
                    });
                })

                ngModelController.$render = function(){
                    elm.html(ngModelController.$viewValue);
                }

            }
        };
    })

    .controller(‘firstController‘, [‘$scope‘, function ($scope) {

        var that = this;

        $scope.hobbies = [
            {
                id: 1,
                name: ‘玩游戏‘
            },
            {
                id: 2,
                name: ‘写代码‘
            },
            {
                id: 3,
                name: ‘睡觉‘
            },
        ];

        $scope.cities = [
            {
                name: ‘上海‘,
                parent: 0,
                id: 1
            },
            {
                name: ‘上海市‘,
                parent: 1,
                id: 2
            },
            {
                name: ‘徐汇区‘,
                parent: 2,
                id: 8
            },
            {
                name: ‘长宁区‘,
                parent: 2,
                id: 3
            },
            {
                name: ‘北京‘,
                parent: 0,
                id: 4
            },
            {
                name: ‘北京市‘,
                parent: 4,
                id: 5
            },
            {
                name: ‘东城区‘,
                parent: 5,
                id: 6
            },
            {
                name: ‘丰台区‘,
                parent: 5,
                id: 7
            },
            {
                name: ‘浙江‘,
                parent: 0,
                id: 9
            },
            {
                name: ‘杭州‘,
                parent: 9,
                id: 100
            },
            {
                name: ‘宁波‘,
                parent: 9,
                id: 11
            },
            {
                name: ‘西湖区‘,
                parent: 100,
                id: 12
            },
            {
                name: ‘北仑区‎‘,
                parent: 11,
                id: 13
            }
        ];

        $scope.data = {
            hobbies: [1, 2],
            city: 3
        };

        // 先保留一份默认值
        $scope.origData = angular.copy($scope.data);

        $scope.reset = function(){

            $scope.data = angular.copy($scope.origData);
            that.initCity();
            $scope.myForm.$setPristine();
        }

        // 让城市关联使用
        this.findCityId = function (parent) {
            var parentId;
            angular.forEach($scope.cities, function (city) {
                if (city.id === parent) {
                    parentId = city.parent;
                    return;
                }
            })

            return parentId;
        }

        this.initCity = function(){
            if ($scope.data.city !== undefined) {
                $scope.data.area = this.findCityId($scope.data.city);
                $scope.data.province = this.findCityId($scope.data.area);
            }
        }

        // 第一次打开页面 需要初始化一下
        this.initCity.call(this);

        $scope.toggleHobbySelection = function (id) {

            var index = -1;
            if ($scope.data.hobbies === undefined) {
                $scope.data.hobbies = [];
            } else {
                index = $scope.data.hobbies.indexOf(id);
            }

            if (index === -1) {
                $scope.data.hobbies.push(id);
            } else {
                $scope.data.hobbies.splice(index, 1);
            }

        }
    }]);
时间: 2024-10-01 23:43:22

angular的 表单的相关文章

angular js 表单验证

1 <!doctype html> 2 <html ng-app="myapp"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 body{ 8 padding: 50px; 9 font-family: "微软雅黑"; 10 } 11 input{ 12 margi

使用Angular提交表单

使用Angular提交表单 我们准备在之前使用的<script>标签中设置我们的Angular应用.所以删除里面的内容,我们就可以开始了. 设置一个Angular应用 步骤为: 1. 加载Angular 2. 设置module 3. 这是controller 4. 将module和controller应用于HTML 5. 设置双向变量绑定 6. 这是错误和信息 看起来好像是很多内容,但是最终,我们会用非常少的代码,并且看起来会非常简洁.另外,创建带有更多输入更大的表单,也会更容易. Angul

基于angular的表单验证实例

最近,在学习angular下面就和大家分享一个简单的表单验证实例 在分享实例之前先整理一下,一些基础知识 input元素上使用的所有验证选项: 1必填项  <input type="text"  required/> 2最小长度 <input type="text" ng-minlength="5"/> 3最大长度 <input type="text" ng-maxlength="20&

angular之表单验证ngMessages

刚接触angular1.x很多经常用到的ngMessages的地方,这里顺便记一下,效果如下图: 如果引用了angular-messages.js报如下错误,说明你的angular.js和angular-messages.js版本不匹配,需要找到能用的版本. 可在这里在线测试各个版本https://docs.angularjs.org/api/ngMessages 引入版本匹配的angular-mseeages.js后,接下来开始使用它提供的表单验证提示吧... 最简单的就是将提示内容直接写在当

Angular.js表单以及与Bootatrap的使用

首先从angular.js的目录开始,如下图,知道了我们要学什么,然后再开始有目的的学习与对比. 1.从表达式开始: ng-app指令初始化一个 AngularJS 应用程序. ng-init指令初始化应用程序数据. 2.指令 3.模型  4.$scope作用域 5.控制器  6.过滤器 ...  7.表单 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content

angular验证表单

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>angular表单验证</title> <style> .box{width: 500px;height:auto;border:solid 1px #ccc;box-shadow: 2px 2px 8px #999;margin:100px auto;} .box>div{box

Angular动态表单生成(七)

动态表单生成之拖拽生成表单(上) 这个功能就比较吊炸天了,之前的六篇,都是ng-dynamic-forms自带的功能,可能很多的说明官方的文档都已经写了,我只是个搬运工,而在这篇文章中,我将化身一个工程师,来自己创造点东西,让我们一起来期待吧~ 导入相关类库 拖拽功能看似吊炸天,其实HTML5中已经有一套标准来定义它了,所以并没有那么难以实现,这篇关于拖拽的文章写得还可以,大家可以先看看:http://www.zhangxinxu.com/wordpress/2011/02/html5-drag

Angular动态表单生成(二)

ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请大家多多指正. 整体结构分析 ng-dynamic-forms的主要代码均分布在packages文件夹下,其中的Core是各种控件的抽象,其他的文件夹是各个UI框架的具体封装,每个文件夹都是一个可独立编译运行的项目. Core文件夹内容分析 Core文件夹做的事情,基本上是对于各种组件.布局的抽象,

Angular动态表单生成(四)

ng-dynamic-forms实践篇(下) 我们接着上篇,先把小目标中的所有字段都定义出来 这部分就是苦力活儿了,把KendoUiComponent中的formModel完善即可: 1 formModel: DynamicFormControlModel[] = [ 2 new DynamicInputModel({ 3 id: 'firstName', 4 label: '姓名', 5 placeholder: '请输入用户姓名' 6 }), 7 new DynamicRadioGroupM