MVVM架构~Knockoutjs系列之验证机制的引入
对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.validation.js,用它来实现对HTML标记的验证,
下面是它在Github上的地址https://github.com/Knockout-Contrib/Knockout-Validation。这个插件的使用很类似MVC自己的验证,如果你自己手动扩展过它的ValidationAttribute,那么你对下面的JS肯定不会
感到陌生,思想是一样的,JS里的Validation也是面向对象的,也支持override,比如系统为非空验证提供的提供是“This field is required.”,你当然可以重写它,让它显示“请输入用户名”,呵呵,这个很简单,下面
看一下某体的代码:
首先要引入这两个JS文件
<script src="~/Scripts/knockout-2.1.0.js"></script>
<script src="~/Scripts/knockout.validation.min.js"></script>
下面的例子中,分别对用户名,分类ID,价格,Email地址做了数据有效性的验证,并且每个验证中的参数都可以以JS对象或者属性的形式存在,这也足够灵活了,如果是JS对象的话,那么params表示参数的值,而message
表示提示的信息,看一下它的实现(很面向对象的,呵呵)。
<script type="text/ecmascript">
var Product = function () {
var self = this; self.CategoryId = ko.observable().extend({
required: true
}); self.price = ko.observable().extend({
required: { params: true, message: "请输入价格" },
min: { params: , message: "请输入大于1的整数" },
max:
}); self.name = ko.observable().extend({
minLength: ,
maxLength: { params: , message: "名称最大长度为30个字符" },
required: {
params: true,
message: "请输入名称",
}
}); self.Email = ko.observable().extend({
required: {
params: true,
message: "Please enter your email"
},
email: {
params: true,
message: "The format is not correct"
}
}); self.Register = function () {
self.errors = ko.validation.group(self);
if (self.isValid()) {
alert('data sent');
} else {
self.errors.showAllMessages();
}
}; }
var viewModel = new Product();
ko.applyBindings(viewModel); </script>
下面再看一下HTML部分,它与之前讲的knockout数据绑定没有区别
<fieldset>
<legend>添加商品</legend>
<div class="editor-label">
@Html.LabelFor(model => model.name)
</div>
<div class="editor-field">
<input data-bind='value: name' />
</div> <div class="editor-label">
@Html.LabelFor(model => model.price)
</div>
<div class="editor-field">
<input data-bind='value: price' /><!-- uniqueName: true表示表单的name是唯一的-->
<div class="editor-label">
@Html.LabelFor(model => model.CategoryId)
</div>
</div>
<div class="editor-field">
<input data-bind='value: CategoryId' />
</div>
<p>
<input type="button" value="Create" data-bind="click:Register" />
</p>
</fieldset>
事实上,比上面的知识更重要的是,我认为还是它的思想,这样东西都可以由前台工程师去开发,然底层开发人员(asp,.net,php,jsp,ios,android)不需要去干预这些,它们只要写好JS文件去调用自己的方法即可,当然JS文件也可以以前台工程师去写,只不
过,这需要前台工程师等底层工程师把接口写好后,再开发了,呵呵。
看一下效果:
aaarticlea/png;base64,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" alt="" />
怎么样,有点MVC的味道吧,呵呵,这个前台validation的表现可以由CSS工程师去搞定,不过,一般这活都是前台工程师的,嗨,前台工程师要负责的东西可真不少PS切图,HTML代码编写,JS代码编写,CSS样式编写,还有如果是MVVM架构,
他们还要了解数据库结构,呵,在这里,让我代表所有开发人员说一声:“前台工程师,你们辛苦了”!
MVVM架构~Knockoutjs系列之验证机制的引入的更多相关文章
- MVVM架构~knockoutjs系列之验证信息自定义输出~续
返回目录 上一讲中,我以一个实际中的例子说明了knockoutjs的自定义验证功能,在使用过程中,出现了一个问题,当然了不是问题,只是一种需求,上一讲中自定义验证的表现是:当页面加载后,自动显示有问题 ...
- MVVM架构~knockoutjs系列之验证信息自定义输出~再续
返回目录 对于一个项目的表单验证,方式有很多,效果也有很多,具体使用哪种完成取决于产品这边,产品让你用什么,你就要用什么,而做为开发人员,我们要做的就是"整理近可能多的架构方式",这样才可以自由的应变 ...
- MVVM架构~knockoutjs系列之验证信息自定义输出
返回目录 这个文章非常重要,也是非常必要的,在我们进行项目开发时,后台无所谓,对样式无要求,而网站前台来说,对样式要求严格,你的验证信息都是前台设计好的,所以,不能使用knockoutjs自带的了,我 ...
- MVVM架构~knockoutjs系列之验证成功提示显示
返回目录 对于knockout.validation来说,我们已经知道了如何去验证大部分表单元素,而有时,我们的需求希望在每个元素验证成功后,去显示正确的提示,这个我们很容易的使用self.元素.is ...
- MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放
返回目录 本文章应该是knockoutjs系列的最后一篇了,前几篇中主要讲一些基础知识,这一讲主要是一个实际的例子,对于一个对象的添加与编辑功能的实现,并将项目源代码公开了,共大家一起学习! knoc ...
- MVVM架构~knockoutjs系列之扩展ajax验证~验证数据是否存在
返回目录 在大部分网站里,用户名都是唯一的,即当用户注册时,如果用户输入的名字不合法,我们需要提示用户,让用户再起个新名字,而这种复杂的验证一般是通过JS来实现的,如果把它集成到ko里,那就完美了.有 ...
- MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等
返回目录 在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给KO,然后返回一个真假值,去做验证,这类似于面向对象语言里的委托,在JS里我们叫它回调方法,本篇文章与前一文章 ...
- MVVM架构~knockoutjs系列之正则表达式使规则更灵活
返回目录 几乎每种验证架构都会有正则表达式的加盟,一般地,一种验证架构首先会提供一些标准的,常用的验证规则,它们通常是数字验证,电话验证,email验证,长度验证,范围验证,日期验证等,而如果使你的验 ...
- MVVM架构~Knockoutjs系列之text,value,attr,visible,with的数据绑定
返回目录 Knockoutjs是微软mvc4里一个新东西,用这在MVC环境里实现MVVM,小微这次没有大张旗鼓,而是愉愉的为我们开发者嵌入了一个实现MVVM的插件,这下面的几篇文章中,我和大家将一起去 ...
随机推荐
- 前端js 判断输入的必须是数字,判断金钱
//输入的必须是数字 $(".xzjl").on("keyup", ".num", function () { var v = $(this ...
- jQuery-强大的jQuery选择器 (详解)[转]
1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, $(&quo ...
- multiple definition of `err_sys' 《UNIX环境高级编程》
本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...
- mentohust 你让我如何说你是好呢?
最近换了ubuntu系统结果热了不少的麻烦, 借此机会唠叨一下, 首先是你这个ubuntu16.4 你这个bug 太让人郁闷了吧,或许主要是应该怪我菜,装个看家的软件eclipse.还热除了一堆的麻 ...
- android目录介绍
- java-集合类
框架图 集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式.数组和集合类同是容器,有何不同?数组存储同一类型的基本数据类 ...
- maven里的modelVersion
modelVersion 描述这个POM文件是遵从哪个版本的项目描述符
- ASP.NET 导出gridview中的数据到Excel表中,并对指定单元格换行操作
1. 使用NPOI读取及生成excel表. (1)导出Click事件: 获取DataTable; 给文件加文件名: string xlsxName = "xxx_" + DateT ...
- leetcode Insertion Sort List
题目:Sort a linked list using insertion sort. 代码: /** * Definition for singly-linked list. * struct Li ...
- 黑马程序员+ADO.Net基础(中)
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net ...