本文我们将介绍使用 Knockout.js 实现一些基本的数据验证。就如我们在标题里提到的,我们会使用两种方法来创建数据验证方法。

  • 使用自定义方法,不需要任何插件
  • 最简单的方法是使用已有的插件

如果你刚刚接触 Knockout.js,强烈建议你阅读我之前的 文章,那篇文章中我分享了一些关于 Knockout.js 的基本知识。本文我们使用 Visual Studio 进行开发,希望你能喜欢。现在开始。

源码下载

第 1 段(可获 1.23 积分)

创建 HTML 页面

要使用 Knockout.js 首先需要一个页面。在此之前请先从 NuGet 上安装 Knockout.js 和 jQuery 。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. <meta charset="utf-8" />
  6. </head>
  7. <body>
  8. </body>
  9. </html>

现在创建一个 JavaScript 文件,并在页面中引入:

  1. <script src="Validations-Without-Plugin.js"></script>

Knockout.js 数据验证之无插件版本

打开你的 JS 文件 (Validations-Without-Plugin.js),这是我们编写脚本的地方。首先,创建视图模型,并使用 tje applyBindings 函数进行绑定。

第 2 段(可获 1.09 积分)
  1. $(function () {
  2. function myViewModel(firstName, lastName, email) {
  3. this.txtFirstName = ko.observable(firstName);
  4. this.txtLastName = ko.observable(lastName);
  5. this.txtEmail = ko.observable(email);
  6. };
  7. ko.applyBindings(new myViewModel("Sibeesh", "Venu", "sibikv4u@gmail.com"));
  8. });

接下来创建视图:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>KnockOut JS Validations</title>
  5. <meta charset="utf-8" />
  6. <script src="Scripts/jquery-3.1.1.min.js"></script>
  7. <script src="Scripts/knockout-3.4.1.js"></script>
  8. <script src="Scripts/Validations-Without-Plugin.js"></script>
  9. </head>
  10. <body>
  11. <table>
  12. <caption>Knockout JS Validation</caption>
  13. <tr>
  14. <td>
  15. First Name: <input type="text" id="txtFirstName" name="txtFirstName" data-bind='value: txtFirstName' />
  16. </td>
  17. </tr>
  18. <tr>
  19. <td>
  20. Last Name: <input type="text" id="txtLastName" name="txtLastName" data-bind='value: txtLastName' />
  21. </td>
  22. </tr>
  23. <tr>
  24. <td>
  25. Email: <input type="text" id="txtEmail" name="txtEmail" data-bind='value: txtEmail' />
  26. </td>
  27. </tr>
  28. <tr>
  29. <td>
  30. <input type="button" value="Submit" />
  31. </td>
  32. </tr>
  33. </table>
  34. </body>
  35. </html>
第 3 段(可获 0.08 积分)

如果打开此页面就能看到视图上已经显示了我们之前在视图模型中定义的数据(你还记得使用 observable() 吗?)

到目前为止一切都很好。接下来需要更新视图模型并创建一些填充剂。

Knockout.js extenders (填充剂) 是最简单的用来给观察值提供额外功能的方式。可以是任何东西,在这里我们为观察值或者是控制器创建一些验证器 。

我们可以创建一个填充剂并使用如下代码来更新视图:

  1. $(function () {
  2. ko.extenders.isRequired = function (elm, customMessage) {
  3. //add some sub-observables to our observable
  4. elm.hasError = ko.observable();
  5. elm.message = ko.observable();
  6. //This is the function to validate the value entered in the text boxes
  7. function validateValueEntered(valEntered) {
  8. elm.hasError(valEntered ? false : true);
  9. //If the custom message is not given, the default one is taken
  10. elm.message(valEntered ? "" : customMessage || "I am required �� ");
  11. }
  12. //Call the validation function for the initial validation
  13. validateValueEntered(elm());
  14. //Validate the value whenever there is a change in value
  15. elm.subscribe(validateValueEntered);
  16. return elm;
  17. };
  18. ko.extenders.isEmail = function (elm, customMessage) {
  19. //add some sub-observables to our observable
  20. elm.hasError = ko.observable();
  21. elm.message = ko.observable();
  22. //This is the function to validate the value entered in the text boxes
  23. function validateEmail(valEntered) {
  24. 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,}))$/;
  25. //If the value entered is a valid mail id, return fals or return true
  26. elm.hasError((emailPattern.test(valEntered) === false) ? true : false);
  27. //If not a valid mail id, return custom message
  28. elm.message((emailPattern.test(valEntered) === true) ? "" : customMessage);
  29. }
  30. //Call the validation function for the initial validation
  31. validateEmail(elm());
  32. //Validate the value whenever there is a change in value
  33. elm.subscribe(validateEmail);
  34. return elm;
  35. };
  36. function myViewModel(firstName, lastName, email) {
  37. this.txtFirstName = ko.observable(firstName).extend({ isRequired: "You missed First Name" });
  38. this.txtLastName = ko.observable(lastName).extend({ isRequired: "" });
  39. this.txtEmail = ko.observable(email).extend({ isEmail: "Not a valid mail id" });
  40. };
  41. ko.applyBindings(new myViewModel("Sibeesh", "Venu", "sibikv4u@gmail.com"));
  42. });
第 4 段(可获 1.16 积分)

这个代码 .extend({ isRequired: “You missed First Name” }); 用来调用我们刚创建的填充剂。第一个参数是我们创建的填充剂的名称,第二个参数是一个自定义消息。我在注释里对代码进行了解释,如果你有任何问题或者疑问可以直接在评论里发表。现在是更新视图的时候了。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>KnockOut JS Validations</title>
  5. <meta charset="utf-8" />
  6. <script src="Scripts/jquery-3.1.1.min.js"></script>
  7. <script src="Scripts/knockout-3.4.1.js"></script>
  8. <script src="Scripts/Validations-Without-Plugin.js"></script>
  9. <style>
  10. .error {
  11. color: #D8000C;
  12. background-color: #FFBABA;
  13. font-family: cursive;
  14. }
  15. table {
  16. border: 1px solid #c71585;
  17. padding: 20px;
  18. }
  19. td {
  20. border: 1px solid #ccc;
  21. padding: 20px;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <table>
  27. <caption>Knockout JS Validation</caption>
  28. <tr>
  29. <td>
  30. First Name: <input type="text" id="txtFirstName" name="txtFirstName" data-bind='value: txtFirstName, valueUpdate: "afterkeydown"' />
  31. <span class="error" data-bind='visible: txtFirstName.hasError, text: txtFirstName.message'></span>
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>
  36. Last Name: <input type="text" id="txtLastName" name="txtLastName" data-bind='value: txtLastName, valueUpdate: "afterkeydown"' />
  37. <span class="error" data-bind='visible: txtLastName.hasError, text: txtLastName.message'></span>
  38. </td>
  39. </tr>
  40. <tr>
  41. <td>
  42. Email: <input type="text" id="txtEmail" name="txtEmail" data-bind='value: txtEmail, valueUpdate: "afterkeydown"' />
  43. <span class="error" data-bind='visible: txtEmail.hasError, text: txtEmail.message'></span>
  44. </td>
  45. </tr>
  46. <tr>
  47. <td>
  48. <input type="button" value="Submit" />
  49. </td>
  50. </tr>
  51. </table>
  52. </body>
  53. </html>
第 5 段(可获 0.73 积分)

每个可观测值有其独立的 hasError 和消息属性。你是否注意到了我们在每个控件的 data-bind 事件中用了 valueUpdate: “afterkeydown” ?这是用于初始的数据验证。接下来我们运行程序并查看结果是否正确。

使用插件实现 Knockout.js 验证

因为要用到插件,我们必须先从 NuGet 上安装这些插件。你可以从 这里 获得所需插件。

现在创建视图模型

  1. $(function () {
  2. function myViewModel(firstName, lastName, email) {
  3. this.txtFirstName = ko.observable(firstName).extend({ required: true });
  4. this.txtLastName = ko.observable(lastName).extend({ required: false });
  5. this.txtEmail = ko.observable(email).extend({ email: true });
  6. };
  7. ko.applyBindings(new myViewModel("Sibeesh", "Venu", "sibikv4u@gmail.com"));
  8. });
第 6 段(可获 1.06 积分)

你可以看到,有其他我们创建的文件相比较,这里只有简单数行代码。现在创建视图:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>KnockOut JS Validations</title>
  5. <meta charset="utf-8" />
  6. <script src="Scripts/jquery-3.1.1.min.js"></script>
  7. <script src="Scripts/knockout-3.4.1.js"></script>
  8. <script src="Scripts/knockout.validation.js"></script>
  9. <script src="Scripts/Validations-Plugin.js"></script>
  10. <style>
  11. table {
  12. border: 1px solid #c71585;
  13. padding: 20px;
  14. }
  15. td {
  16. border: 1px solid #ccc;
  17. padding: 20px;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <table>
  23. <caption>Knockout JS Validation</caption>
  24. <tr>
  25. <td>
  26. First Name: <input type="text" id="txtFirstName" name="txtFirstName" data-bind='value: txtFirstName' />
  27. </td>
  28. </tr>
  29. <tr>
  30. <td>
  31. Last Name: <input type="text" id="txtLastName" name="txtLastName" data-bind='value: txtLastName' />
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>
  36. Email: <input type="text" id="txtEmail" name="txtEmail" data-bind='value: txtEmail' />
  37. </td>
  38. </tr>
  39. <tr>
  40. <td>
  41. <input type="button" value="Submit" />
  42. </td>
  43. </tr>
  44. </table>
  45. </body>
  46. </html>
第 7 段(可获 0.33 积分)

别忘了在页面中引入 knockout.validation.js 脚本文件。如果一切准备就绪,就可以运行程序并查看输出结果。

今天就讲这么多。你可以下载本文源码。

参考资料

另请参阅

Knockout.js 数据验证之插件版和无插件版的更多相关文章

  1. jQuery鼠标移入移出(冒泡版和无冒泡版)

    带冒泡事件的鼠标移入移出(默认的):mouseover和mouseout事件 没有冒泡事件的鼠标移入移出:mouseenter和mouseleave事件

  2. jquery数据验证插件(自制,简单,练手)

    一:最近项目中js数据验证比较多,为了统一风格,移植复用,于是顺手封装了Jquery的插件. (function($) { var defaults = { bugColor: '#FFCCCC', ...

  3. jquery数据验证插件

    jquery数据验证插件(自制,简单,练手)   一:最近项目中js数据验证比较多,为了统一风格,移植复用,于是顺手封装了Jquery的插件. (function($) { var defaults ...

  4. 7.Knockout.Js(Mapping插件)

    前言 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些o ...

  5. 【转】基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  6. 基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  7. 基于jquery,bootstrap数据验证插件bootstrapValidator

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  8. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  9. knockout更新列表中的某条数据,knockout.js绑定数组时更新其中一条数据

    knockout是一款前端实现MVVM的JS框架,仅knockout.js一个47kb的文件,相当实用,做前端无刷新页面,快速实现JS与HTML数据交互. knockout目前最新版:knockout ...

随机推荐

  1. HTTP的KeepAlive是开启还是关闭?

    HTTP的KeepAlive是开启还是关闭? http://itindex.net/detail/50719-http-keepalive 1.KeepAlive的概念与优势 HTTP的KeepAli ...

  2. Selenium2+python自动化59-数据驱动(ddt)

    前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的.如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一 ...

  3. [翻译] FlatUIKit

    FlatUIKit FlatUIKit is a collection of iOS components styled with the "Flat UI" aesthetic ...

  4. apache kafka消息服务

    apache kafka中国社区QQ群:162272557 apache kafka参考 http://kafka.apache.org/documentation.html 消息队列分类: 点对点: ...

  5. Ubuntu安装Oracle时出现乱码,及其他安装错误

    只要在运行./runInstaller之前先运行下以下命令就ok了: export LANG=en_US #设置运行语言 编译错误 ln -s /usr/lib/i386-linux-gnu/libp ...

  6. OpenCV学习(28) 轮廓

    OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来.主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CH ...

  7. ASP.NET与ASP.NET MVC 中Cache的总结

    Cache有多种翻译,可以是高速缓冲存储器,也可以是法国的服装品牌,本文只是简单的谈谈就是ASP.NET 中Cache,做过Web应用程序的都知道,如果网站访问量比较大,系统应用程序可以将那些频繁访问 ...

  8. Maximal Rectangle leetcode java

    题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones ...

  9. Remove Nth Node From End of List leetcode java

    题目: Given a linked list, remove the nth node from the end of list and return its head. For example, ...

  10. 内存泄漏 Memory Leaks 内存优化 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...