• MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength


    返回目录

    为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好,但对于程序来说就有些麻烦了,因为

    我们的Length方法只针对英文字符和数字而言的

    原因1:事实上,真实的数据存储里,中文和全角他们占用的是两个字符的空间,所以,我们在验证中文时,应该考虑到这点.

    原因2:不说计算机基础知识,但说现实世界里,如果你的用户名由4~10位组成,那么,如果你用Length方法,那基本上对中文的名称被90%的拒绝了,因为只有小部分中国文会起四个字的名字,呵呵.

    说干就干:

    从网站上搜索了一下,找到了一个不错的JS方法,用来验证中文和英文字母的长度,原代码

        /**
        * 字符串长度-中文和全角符号为2,英文、数字和半角为1
        * @param str
        * @return {Number}
        */
        var getLength = function (str) {
            return Math.ceil(str.replace(/^s+|s+$/ig, '').replace(/[^x00-xff]/ig, 'xx').length);
        };
        /**
        * 按字数截取字符串
        * @param str
        * @param len
        * @return {*}
        */
        var subStr = function (str, len) {
            if (!str) {
                return '';
            }
            len = len > 0 ? len * 2 : 280;
            var count = 0, //计数:中文2字节,英文1字节
                temp = '';  //临时字符串
            for (var i = 0; i < str.length; i++) {
                if (str.charCodeAt(i) > 255) {
                    count += 2;
                }
                else {
                    count++;
                }
                //如果增加计数后长度大于限定长度,就直接返回临时字符串
                if (count > len) {
                    return temp;
                }
                //将当前内容加到临时字符串
                temp += str.charAt(i);
            }
            return str;
        };
        var checkStrLength = function (str, minL, maxL) {
            var len = getLength($.trim(str));
            var data = {
                'checkL': (len >= minL && len <= maxL),
                'restL': maxL - len,
                'restStr': subStr(str, maxL)
            };
            return data;
        };
    
    

    我们将它与ko.validation架构进行结合,但它在ko中去呈现

        /*扩展的字符长度验证,支持中文占两个字符的空间*/
        kv.rules['extMinLength'] = {
            validator: function (val, minLength) {
                if (!kv.utils.isEmptyVal(val)) {
                    console.log(getLength(val));
                    console.log(minLength);
                }
                return kv.utils.isEmptyVal(val) || getLength(val) >= minLength;
            },
            message: 'Please enter at least {0} characters.(extension validator for zzl)'
        };
    
        kv.rules['extMaxLength'] = {
            validator: function (val, maxLength) {
                return kv.utils.isEmptyVal(val) || getLength(val) <= maxLength;
            },
            message: 'Please enter no more than {0} characters.(extension validator for zzl)'
        };

    下面我们看一下如何去调用它

       self.extName = ko.observable().extend({
                    extMinLength: 4,
                    extMaxLength: { params: 20, message: "名字太长了" },
         });

    看一下运行的结果

    返回目录

  • 相关阅读:
    基于 abp vNext 和 .NET Core 开发博客项目
    基于 abp vNext 和 .NET Core 开发博客项目
    基于 abp vNext 和 .NET Core 开发博客项目
    基于 abp vNext 和 .NET Core 开发博客项目
    数据结构 6 基础排序算法详解 冒泡排序、三层冒泡排序逐步优化方案详解
    数据结构 5 哈希表/HashMap 、自动扩容、多线程会出现的问题
    数据结构 4 时间复杂度、B-树 B+树 具体应用与理解
    数据结构 3 二叉查找树、红黑树、旋转与变色 理解与使用
    数据结构 2 字符串 数组、二叉树以及二叉树的遍历
    数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解
  • 原文地址:https://www.cnblogs.com/lori/p/3738973.html
Copyright © 2020-2023  润新知