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: "名字太长了" },
});

看一下运行的结果

返回目录

时间: 2024-12-10 15:25:36

MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength的相关文章

MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等

返回目录 在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给KO,然后返回一个真假值,去做验证,这类似于面向对象语言里的委托,在JS里我们叫它回调方法,本篇文章与前一文章不同,需要有两个参数,其一是远程方法的签名(JS方法),其二是已知要比较的数据(可能是加密后的密码数据),当用户输入文字后,它将会调用JS方法获取远程数据,以比较原数据与你输入的数据是否匹配. 知识点:以对象作为参数进行传递 ko.validation.js的扩展 //ajax相等验证 kv.rul

MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象

返回目录 一些要说的 这是一个很有意思的题目,在KO里,有对象和数组对象两种,但这两种对象对外表现都是一个function,如果希望得到他的值,需要进行函数式调用,如ko_a(),它的结果为一个具体值或者数组或者函数,而ko_a则表示一个KO对象. 今天主要说一下如何在ajax方法里向后台传递对象和数组等参数,一般说来,我们为后台传递的是字符串和数字,而如果希望传递对象,则需要使用$.param这个方法,下面具体用代码说一下. 一些要做的 一般后以的代码理想是这样的 public JsonRes

MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法

说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都在它的源码里,只要你踏下心去看,一切就都有了! Knockout.Validation.js是为Knockout插件服务的,它可以为Knockout对象进行验证,就像你使用MVC模型验证 一样,而这种绑定的验证方式对于开发人员来说是很容易接受的,也是一种趋势,它在验证过程中,会将出现异常的点记录下来,然后在

MVVM架构~knockoutjs系列之文本框数符长度动态统计功能

返回目录 这个功能为什么要写呢,因为在之前做了一个前端的页面效果,使用JS写的,感觉很累,真的,对于一个文本框长度动态统计,你要写blur,press,down什么的事件,太麻烦了,这时,我想到了knockoutjs,这东西好,为什么,是因为它够简单,够强大,这两点对于程序员来说,就是好! 先来看一下页面的效果 当字数达到某个值时,如10个字,这时文本框将不允许你再次输入,这使用了subscribe,而长度与文框关的关联使用了computed(dependentObservable依赖监视器也是

MVVM架构~knockoutjs系列之数组的$index和$data

返回目录 已经写了很多knockoutjs的文章了,今天在review代码时,忽然看到一个问题,在knockout环境下,如何遍历一个简单的数组?对于遍历对象组件的数组来说,很容易,直接foreach:对象名,然后进行属性的绑定即可,而如下数据[10,20,30]这种简单的数组,如何去遍历呢?在阅读knockout官网后,找到了答案,如下实例: <label>博主</label> <div data-bind="text:User.title">&l

MVVM架构~使用boxy和knockoutjs实现编辑功能

这个功能我认为非常有用,尤其在后台管理系统中,它对用户来说,使用体验这块非常不错,下面是它的截图 说在前 在实现这个功能中,我们对knockout的基础知识一定要牢牢掌握,要知道,在knockout里一切都是对象,并且要知识knockout可以根据DIV进行绑定,对于验证这块,可以根据你的object进行验证,而并非只能验证全局对象,而对于boxy来说, 要知道它加载HTML代码的方式(如果HTML代码上有knockout绑定,则需要先将html代码加载上,然后再绑定model,这就用到了box

《Android构建MVVM》系列(一) 之 MVVM架构快速入门

前言 本文属于<Android构建MVVM>系列开篇,共六个篇章,详见目录树. 该系列文章旨在为Android的开发者入门MVVM架构,掌握其基本开发模式. 辅以讲解Android Architecture Components,使得更好的实现MVVM架构. 目录树 <Android构建MVVM>系列(一) 之 MVVM架构快速入门 前言 分层思想 什么是MVC/MVP? MVVM是什么,与MVC/MVP有何区别? Android Architecture Components(架

[转]MVVM架构~mvc,mvp,mvvm大话开篇

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller. 在MVC里,View是可以直接访问

【PC网站前端架构探讨系列】关于中小型PC网站前端架构方案的讨论与实践

 说在前面 好几天没更新这个系列文章了,这段时间还是在研究这块东西,遇到的各种奇葩问题,最后写完,只是调试就花了两天,果然发现在和大神之间的距离越来越远,在加上大部分时间在追求自己的梦想,梦想同样也是遥遥无期啊!一直在思考星星的那句话,人到底该不该追求梦想,做个咸鱼到底好不好的,吃吃喝喝睡睡的,反正最近感悟挺多,抽时间写个文章,好好和大家聊聊,把我的心里话告诉大家,程序员不容易,寻梦者更难啊!比如,这个所谓的pc网站的前端框架,这对一个做后台而且还是多年一直在做C#.JAVA没怎么写脚本的我来说