返回目录html
在大部分网站里,用户名都是惟一的,即当用户注册时,若是用户输入的名字不合法,咱们须要提示用户,让用户再起个新名字,而这种复杂的验证通常是经过JS来实现的,若是把它集成到ko里,那就完美了.有了这个想法,我开始尝试它,相信必定能够成功的!ajax
起初在设计时出现了不少问题,如ajax异步问题,延时处理问题,ajax返回值问题等等,通过几回失败后,在总结了相关知识后,终于设计出来了一个不错的扩展,即 ajaxData验证方式.json
扩展ko.validation.js代码异步
kv.rules['ajaxData'] = { validator: function (val, ajaxMethod) { var result = true; $.when(ajaxMethod(val)).then(function (data) { result = kv.utils.isEmptyVal(val) || data; //val为空走reqired逻辑,不为空再走ajax逻辑 }); return result; }, message: 'Please enter info is no corrent.' };
HTML代码async
function existUser(name) { return $.ajax({ //必须加return才能够将它返回 url: "/ef/IsNotExist?name=" + name, type: "get", dataType: "json", async: false, success: function (data) { return data; } }); }
调用方式网站
self.UserName = ko.observable().extend({ minLength: 2, maxLength: { params: 30, message: "名称最大长度为30个字符" }, required: { params: true, message: "请输入名称" }, ajaxData: { params: existUser, message: "用户已经存在" } });
运行后的效果如图ui
最后要说明的一点是,目前ajax只能使用同步方式,由于在ko.validation内部有一个机制,若是程序没有返回,那么验证会返回false,即验证失败,如对于异步请求来讲,它不会阻塞当前线程的执行,因此,它会直接输出false,而不走咱们的验证程序.url
返回目录spa