Knockout.js 数据验证之插件版和无插件版
本文我们将介绍使用 Knockout.js 实现一些基本的数据验证。就如我们在标题里提到的,我们会使用两种方法来创建数据验证方法。
- 使用自定义方法,不需要任何插件
- 最简单的方法是使用已有的插件
如果你刚刚接触 Knockout.js,强烈建议你阅读我之前的 文章,那篇文章中我分享了一些关于 Knockout.js 的基本知识。本文我们使用 Visual Studio 进行开发,希望你能喜欢。现在开始。
源码下载
创建 HTML 页面
要使用 Knockout.js 首先需要一个页面。在此之前请先从 NuGet 上安装 Knockout.js 和 jQuery 。
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body>
</body>
</html>
现在创建一个 JavaScript 文件,并在页面中引入:
<script src="Validations-Without-Plugin.js"></script>
Knockout.js 数据验证之无插件版本
打开你的 JS 文件 (Validations-Without-Plugin.js),这是我们编写脚本的地方。首先,创建视图模型,并使用 tje applyBindings 函数进行绑定。
$(function () {
function myViewModel(firstName, lastName, email) {
this.txtFirstName = ko.observable(firstName);
this.txtLastName = ko.observable(lastName);
this.txtEmail = ko.observable(email);
};
ko.applyBindings(new myViewModel("Sibeesh", "Venu", "sibikv4u@gmail.com"));
});
接下来创建视图:
<!DOCTYPE html>
<html>
<head>
<title>KnockOut JS Validations</title>
<meta charset="utf-8" />
<script src="Scripts/jquery-3.1.1.min.js"></script>
<script src="Scripts/knockout-3.4.1.js"></script>
<script src="Scripts/Validations-Without-Plugin.js"></script>
</head>
<body>
<table>
<caption>Knockout JS Validation</caption>
<tr>
<td>
First Name: <input type="text" id="txtFirstName" name="txtFirstName" data-bind='value: txtFirstName' />
</td>
</tr>
<tr>
<td>
Last Name: <input type="text" id="txtLastName" name="txtLastName" data-bind='value: txtLastName' />
</td>
</tr>
<tr>
<td>
Email: <input type="text" id="txtEmail" name="txtEmail" data-bind='value: txtEmail' />
</td>
</tr>
<tr>
<td>
<input type="button" value="Submit" />
</td>
</tr>
</table>
</body>
</html>
如果打开此页面就能看到视图上已经显示了我们之前在视图模型中定义的数据(你还记得使用 observable() 吗
?)
到目前为止一切都很好。接下来需要更新视图模型并创建一些填充剂。
Knockout.js extenders (填充剂) 是最简单的用来给观察值提供额外功能的方式。可以是任何东西,在这里我们为观察值或者是控制器创建一些验证器 。
我们可以创建一个填充剂并使用如下代码来更新视图:
$(function () {
ko.extenders.isRequired = function (elm, customMessage) {
//add some sub-observables to our observable
elm.hasError = ko.observable();
elm.message = ko.observable();
//This is the function to validate the value entered in the text boxes
function validateValueEntered(valEntered) {
elm.hasError(valEntered ? false : true);
//If the custom message is not given, the default one is taken
elm.message(valEntered ? "" : customMessage || "I am required �� ");
}
//Call the validation function for the initial validation
validateValueEntered(elm());
//Validate the value whenever there is a change in value
elm.subscribe(validateValueEntered);
return elm;
};
ko.extenders.isEmail = function (elm, customMessage) {
//add some sub-observables to our observable
elm.hasError = ko.observable();
elm.message = ko.observable();
//This is the function to validate the value entered in the text boxes
function validateEmail(valEntered) {
var emailPattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
//If the value entered is a valid mail id, return fals or return true
elm.hasError((emailPattern.test(valEntered) === false) ? true : false);
//If not a valid mail id, return custom message
elm.message((emailPattern.test(valEntered) === true) ? "" : customMessage);
}
//Call the validation function for the initial validation
validateEmail(elm());
//Validate the value whenever there is a change in value
elm.subscribe(validateEmail);
return elm;
};
function myViewModel(firstName, lastName, email) {
this.txtFirstName = ko.observable(firstName).extend({ isRequired: "You missed First Name" });
this.txtLastName = ko.observable(lastName).extend({ isRequired: "" });
this.txtEmail = ko.observable(email).extend({ isEmail: "Not a valid mail id" });
};
ko.applyBindings(new myViewModel("Sibeesh", "Venu", "sibikv4u@gmail.com"));
});
这个代码 .extend({ isRequired: “You missed First Name” });
用来调用我们刚创建的填充剂。第一个参数是我们创建的填充剂的名称,第二个参数是一个自定义消息。我在注释里对代码进行了解释,如果你有任何问题或者疑问可以直接在评论里发表。现在是更新视图的时候了。
<!DOCTYPE html>
<html>
<head>
<title>KnockOut JS Validations</title>
<meta charset="utf-8" />
<script src="Scripts/jquery-3.1.1.min.js"></script>
<script src="Scripts/knockout-3.4.1.js"></script>
<script src="Scripts/Validations-Without-Plugin.js"></script>
<style>
.error {
color: #D8000C;
background-color: #FFBABA;
font-family: cursive;
}
table {
border: 1px solid #c71585;
padding: 20px;
}
td {
border: 1px solid #ccc;
padding: 20px;
}
</style>
</head>
<body>
<table>
<caption>Knockout JS Validation</caption>
<tr>
<td>
First Name: <input type="text" id="txtFirstName" name="txtFirstName" data-bind='value: txtFirstName, valueUpdate: "afterkeydown"' />
<span class="error" data-bind='visible: txtFirstName.hasError, text: txtFirstName.message'></span>
</td>
</tr>
<tr>
<td>
Last Name: <input type="text" id="txtLastName" name="txtLastName" data-bind='value: txtLastName, valueUpdate: "afterkeydown"' />
<span class="error" data-bind='visible: txtLastName.hasError, text: txtLastName.message'></span>
</td>
</tr>
<tr>
<td>
Email: <input type="text" id="txtEmail" name="txtEmail" data-bind='value: txtEmail, valueUpdate: "afterkeydown"' />
<span class="error" data-bind='visible: txtEmail.hasError, text: txtEmail.message'></span>
</td>
</tr>
<tr>
<td>
<input type="button" value="Submit" />
</td>
</tr>
</table>
</body>
</html>
每个可观测值有其独立的 hasError
和消息属性。你是否注意到了我们在每个控件的 data-bind 事件中用了 valueUpdate: “afterkeydown”
?这是用于初始的数据验证。接下来我们运行程序并查看结果是否正确。
使用插件实现 Knockout.js 验证
因为要用到插件,我们必须先从 NuGet 上安装这些插件。你可以从 这里 获得所需插件。
现在创建视图模型
$(function () {
function myViewModel(firstName, lastName, email) {
this.txtFirstName = ko.observable(firstName).extend({ required: true });
this.txtLastName = ko.observable(lastName).extend({ required: false });
this.txtEmail = ko.observable(email).extend({ email: true });
};
ko.applyBindings(new myViewModel("Sibeesh", "Venu", "sibikv4u@gmail.com"));
});
你可以看到,有其他我们创建的文件相比较,这里只有简单数行代码。现在创建视图:
<!DOCTYPE html>
<html>
<head>
<title>KnockOut JS Validations</title>
<meta charset="utf-8" />
<script src="Scripts/jquery-3.1.1.min.js"></script>
<script src="Scripts/knockout-3.4.1.js"></script>
<script src="Scripts/knockout.validation.js"></script>
<script src="Scripts/Validations-Plugin.js"></script>
<style>
table {
border: 1px solid #c71585;
padding: 20px;
}
td {
border: 1px solid #ccc;
padding: 20px;
}
</style>
</head>
<body>
<table>
<caption>Knockout JS Validation</caption>
<tr>
<td>
First Name: <input type="text" id="txtFirstName" name="txtFirstName" data-bind='value: txtFirstName' />
</td>
</tr>
<tr>
<td>
Last Name: <input type="text" id="txtLastName" name="txtLastName" data-bind='value: txtLastName' />
</td>
</tr>
<tr>
<td>
Email: <input type="text" id="txtEmail" name="txtEmail" data-bind='value: txtEmail' />
</td>
</tr>
<tr>
<td>
<input type="button" value="Submit" />
</td>
</tr>
</table>
</body>
</html>
别忘了在页面中引入 knockout.validation.js 脚本文件。如果一切准备就绪,就可以运行程序并查看输出结果。
今天就讲这么多。你可以下载本文源码。
参考资料
另请参阅
Knockout.js 数据验证之插件版和无插件版的更多相关文章
- jQuery鼠标移入移出(冒泡版和无冒泡版)
带冒泡事件的鼠标移入移出(默认的):mouseover和mouseout事件 没有冒泡事件的鼠标移入移出:mouseenter和mouseleave事件
- jquery数据验证插件(自制,简单,练手)
一:最近项目中js数据验证比较多,为了统一风格,移植复用,于是顺手封装了Jquery的插件. (function($) { var defaults = { bugColor: '#FFCCCC', ...
- jquery数据验证插件
jquery数据验证插件(自制,简单,练手) 一:最近项目中js数据验证比较多,为了统一风格,移植复用,于是顺手封装了Jquery的插件. (function($) { var defaults ...
- 7.Knockout.Js(Mapping插件)
前言 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些o ...
- 【转】基于jquery,bootstrap数据验证插件bootstrapValidator 教程
bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...
- 基于jquery,bootstrap数据验证插件bootstrapValidator 教程
bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...
- 基于jquery,bootstrap数据验证插件bootstrapValidator
bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- knockout更新列表中的某条数据,knockout.js绑定数组时更新其中一条数据
knockout是一款前端实现MVVM的JS框架,仅knockout.js一个47kb的文件,相当实用,做前端无刷新页面,快速实现JS与HTML数据交互. knockout目前最新版:knockout ...
随机推荐
- 使用Bootstrap 3开发响应式网站实践07,页脚
页脚部分比较简单,把一个12列的Grid切分. <footer> <div class="container"> <div class="r ...
- java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
一:如果出现下面的错误信息,如果你的项目是Maven结构的,那么一般都是你的项目的Maven Dependencies没有添加到项目的编译路径下: 信息: The APR based Apache T ...
- wireshark提取gzip格式的html
原文地址:http://blog.csdn.net/vah101/article/details/44102501 首先使用wireshark启动抓包,然后以百度为例,访问百度的首页,之后停止抓包,w ...
- onWindowFocusChanged重要作用 and Activity生命周期
onWindowFocusChanged重要作用 Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onW ...
- 【postman】postman访问zuul路由网关,发生Could not get any response 的情况
情况如下: zuul配置的自定义过滤器,对所有由zuul进行路由转发的请求进行安全验证,如果请求中包含auth,则成功路由,否则失败. 代码如下: package com.swapping.sprin ...
- FastJson和Gson和Json数据解析分析和用法
首先分析下目前号称最快的FastJson,这个是所有人都验证过的,解析速度确实比较快,不过也需要根据数据量来看,数据量小的时候,Gson性能要稍微优于FastJson,但在数据量大解析的情况下,Fas ...
- scala编程第18章学习笔记——有状态的对象
银行账号的简化实现: scala> class BankAccount{ | private var bal: Int = 0 | def balance: Int = bal | def de ...
- Objective-C:协议protocol
六.协议(protocol) 关键字:@optional.@required (1)是一个类共享的一个方法列表 (2)它声明了一系列的方法而不进行实现 (3)遵从某个协议,就是需要实现协议中的方法 ( ...
- C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展
#include<stdio.h> #include<stdlib.h> #include<time.h> typedef struct { char name[3 ...
- C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理
C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ...