angularjs学习第五天笔记(第二篇:表单验证升级篇)

2018-08-31 09:43:57 浏览数 (1)

您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点评与赐教。谢谢!

  第五天,昨天学习了简单的表单验证,在昨天的基础上,今天主要对表单验证进一步学习研究。

  今天主要学习一下几点:文本框失去焦点后验证、表单验证提示信息显示处理优化

第一、文本框失去焦点后验证

    文本框失去焦点验证效果:文本框失去焦点后对其合法性验证

    文本框失去焦点验证实现方式:定义一个指令(指令后续专门研究)当文本框失去焦点是设置focused=true,获得焦点为false

                  提示显示信息添加并列显示条件(focused)

    举一个具体的练习实例

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style type="text/css">
        .oneCount {
            width: 1000px;
            height: 60px;
            line-height: 60px;
            border-bottom: 1px solid blue;
        }

            .oneCount .titleCount {
                float: left;
                width: 150px;
                text-align: right;
            }

            .oneCount .valueCount {
                float: left;
                width: 300px;
                text-align: right;
            }

                .oneCount .valueCount input {
                    width: 300px;
                }

            .oneCount .alertCount {
                float: left;
                width: 520px;
                margin-left: 20px;
            }

                .oneCount .alertCount span {
                    float: left;
                    margin-left: 10px;
                    color: #ff0000;
                }

        .success {
            color: #19e1cf !important;
        }

        input .ng-pristine {
            color: #808080;
            border-bottom: 1px solid #ff0000;
        }

        input .ng-dirty {
            color: #000000;
        }

        input .ng-valid {
            color: #000000;
        }

        input .ng-invalid {
            color: #ff0000;
        }
    </style>
</head>
<body ng-app="myApp" ng-controller="myContro">
    <form name="loginForm" novalidate ng-submit="submitForm()">
        <div class="oneCount">
            <div class="titleCount">账号:</div>
            <div class="valueCount">
                <input type="text" name="acount" ng-model="user.acount"
                       placeholder="必填:账号必须由数字字母组合,长度在6-20"
                       required="required" ng-minlength="6" ng-maxlength="20"
                       ng-pattern="/^[0-9a-zA-Z] $/"
                       ng-focus />
            </div>
            <div class="alertCount">
                <span class="warning">*</span>
                <div class="warning"
                     ng-show="loginForm.acount.$invalid && ((!loginForm.acount.$focused && loginForm.acount.$dirty) || loginForm.submitted )">
                    <span class="warning"
                          ng-show="loginForm.acount.$error.required">acount必填</span>
                    <span class="warning"
                          ng-show="loginForm.acount.$error.minlength">最少长度为6</span>
                    <span class="warning"
                          ng-show="loginForm.acount.$error.maxlength">最大长度为20</span>
                    <span class="warning"
                          ng-show="loginForm.acount.$error.pattern">账号格式不符合要求(只能由数字和字母组成)</span>
                </div>
                <span class="success"
                      ng-show="!loginForm.acount.$focused &&loginForm.acount.$valid">账号输入正确</span>
            </div>
        </div>
        <div class="oneCount">
            <div class="titleCount">姓名:</div>
            <div class="valueCount">
                <input type="text" name="name" ng-model="user.name" placeholder="请输入姓名" ng-maxlength="20"
                       ng-focus />
            </div>
            <div class="alertCount">
                <span class="warning" ng-show="!loginForm.name.$focused && loginForm.name.$error.maxlength">姓名最大长度为20</span>
                <span class="success" ng-show="!loginForm.name.$focused && loginForm.name.$dirty && loginForm.name.$valid">姓名输入正确</span>
            </div>
        </div>
        <div class="oneCount">
            <div class="titleCount"></div>
            <div class="valueCount">
                <input type="submit" value="提交" style="width:40px;" />
            </div>
        </div>
    </form>
</body>
</html>
<script src="Scripts/angular.js"></script>
<script type="text/javascript">
    var app = angular.module("myApp", []);
    app.controller("myContro", function ($scope) {
        $scope.user = {
            acount: "w额外",
            name: "",
            age: "",
            pass: "",
            rePass: ""
        };

        $scope.submitted = false;

        //提交表单接受函数
        $scope.submitForm = function () {
            if ($scope.loginForm.$valid) {
                //// 表单数据真实提交逻辑
            } else {
                $scope.loginForm.submitted = true;
            }
        }
    });

    app.directive('ngFocus', function () {
        var FOCUS_CLASS = "ng-focused";
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, element, attrs, ctrl) {
                ctrl.$focused = false;
                element.bind('focus', function (evt) {
                    element.addClass(FOCUS_CLASS);
                    scope.$apply(function () {
                        ctrl.$focused = true;
                    });
                }).bind('blur', function () {
                    element.removeClass(FOCUS_CLASS);
                    scope.$apply(function () {
                        ctrl.$focused = false;
                    })
                })
            }
        }
    })
</script>

  第二、表单验证提示信息显示处理优化

上面的表单验证的提示信息在体验上不是很友好,同一个文本框有可能同时显示多个提示信息

    新版本的angularjs中,引入了ngMessages指令,用于更加友好的处理方式

 ngmessages同时指出提示模板引入,通过ng-messges-include 来加载外部提示模板

  直接上练习例子

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body ng-app="myApp" ng-controller="myContro">
    <form name="loginForm" novalidate ng-submit="submitForm()">
        <div class="oneCount">
            <div class="titleCount">账号:</div>
            <div class="valueCount">
                <input type="text" name="acount" ng-model="user.acount"
                       placeholder="必填:账号必须由数字字母组合,长度在6-20"
                       required="required" ng-minlength="6" ng-maxlength="20"
                       ng-pattern="/^[0-9a-zA-Z] $/"
                       ng-focus />
            </div>
            <div class="alertCount">
                <span class="warning">*</span>
                <div class="warning" ng-messages="loginForm.acount.$error">
                    <ng-messages-include src="template/required.html"></ng-messages-include>
                    <span class="warning"
                          ng-message="minlength">该项最少长度为6</span>
                    <span class="warning"
                          ng-message="maxlength">该项最大长度为20</span>
                    <div ng-messages-include="template/numberAndZhiMu.html">
                    </div>
                </div>
            </div>
        </div>
        <div class="oneCount">
            <div class="titleCount"></div>
            <div class="valueCount">
                <input type="submit" value="提交" style="width:40px;" />
            </div>
        </div>
    </form>
</body>
</html>
<script src="Scripts/angular.js"></script>
<script src="Scripts/angular-messages.js"></script>
<script type="text/javascript">
    var app = angular.module("myApp", ['ngMessages']);
    app.controller("myContro", function ($scope) {
        $scope.user = {
            acount: ""
        };

        $scope.submitted = false;

        //提交表单接受函数
        $scope.submitForm = function () {
            if ($scope.loginForm.$valid) {
                //// 表单数据真实提交逻辑
            } else {
                $scope.loginForm.submitted = true;
            }
        }
    });
</script>

时间不早了,明天在仔细研究该问题

今天就到此为止,明天继续研究表单验证,明天学习包括如下几点

表单验证继续研究

  指令简单了解学习

0 人点赞