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的插件,这下面的几篇文章中,我和大家将一起去 ...
随机推荐
- fastjson自动转化参数报错
开发环境:spring-mvc4.1.7.fastjson1.2.7 问题描述:系统采用的前后端完全分离方式,前端页面使用ajax调用后台服务时,想用fastjson自动转化请求参数对象. // 前端 ...
- 【转】当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ http://www.cnblogs.com/panx ...
- Spark难道比oracle性能还差?百万级数据测试性能
本人对大数据方面也是刚刚研究,由于工作需要在实时查询与统计的性能方面要深入学习.现测试性能如下: 环境:VirtualBox host-only ubuntu版本: Linux master 4 ...
- js时间处理函数
Date 对象的方法简介: ·Date | 返回当日的日期和时间 ·getDate | 从 Date 对象返回一个月中的某一天 (1 ~ 31) ·getDay | 从 Date 对象返回一周中 ...
- 浅谈城市规划在移动GIS方面的应用发展
1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...
- 位图图像处理控件ImageCapture Suite更新至v9.1
概述:Dynamsoft公司旗下非常出名的位图图像处理控件ImageCapture Suite更新至了v9.1,这次新版本为Mac版本和IE 9新增了不少功能,同时还对其他组件的性能进行了质的提高! ...
- Redux-Form学习笔记
总结下使用Redux-Form的步骤,基本的Form使用我分为一下5步: 安装Redux-Form npm install --save redux-form 创建reducer import {re ...
- Unity : Ran out of trampolines of type 2
Unity 导出游戏到 iOS 平台,当时选择的设置是 mono2x, 结果游戏各种莫名其妙的崩溃,再崩溃, 几乎运行不到一分钟就崩溃,而在 editor 和 android 平台都是正常的. 查看出 ...
- C# 委托学习笔记
接触委托 代理 delegate很久啦.除了看API,Kotoba也给我讲了 .说到委托,拿下面这个小例子比较好.(14年6月26花花给我的练习) 实例:写一个方法A,定义个方法B(打印hello), ...
- switch...case和if...else if的判断应用
判断成绩所属等级的 两种方法 1... switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...