最近开始用KnockoutJS 作为client的主要框架,结合Bootstrap, BootstrapValidator, 直接调用Web api,绕过MVC的controller那层来交互数据,效果非常不错,项目做到现在进度一半,knockout的优点很多,所以这里小结一下:

Q: 什么是KnockoutJS?

A: 我们都叫它KO, 一个基于MVVM架构的轻量级JavaScript框架,最大的特点就是支持界面Dom对象和JS 数据对象的双向绑定。

Q:KO的优点?

  • 免费,使用MIT开源软件许可协议
  • 纯JavaScript, 可以和任何其他框架一起工作,没有依赖
  • 轻量级框架, 相对于AugularJS, jQuery,压缩后只有20kb
  • 已经比较成熟,支持IE6+, Firefox     3.5+, Chrome, Opera, Safari等浏览器
  • KO做的事情j比如Query也能做,但是比较麻烦,有很多代码需要写,而且不够直观; AugularJS也能做,但是比较复杂,学习成本较高。

接下来,我们来了解下如何完成一个KO的页面:

  1. 数据

KO提供了灵活的方式支持对JS的对象定义在View Model,然后绑定到HTML元素上,View Model里面的值和 HTML上面的元素相匹配。

  1. 声明普通JS 对象来定义View Model对象
varmyViewModel = {personName:'Bob',personAge: ko.observable(123),jobs:ko.observableArray("Engineer", "Tester")
};varContactsModel = function (contacts) {var self = this;self.FirstName = "King";self.LastName =ko.observable("");self.Id = "";
}

Note:

  1. 普通的赋值适用于值不变的对象,适用于Lable等
  2. Observable代表双向绑定,也就是界面的DOM对象更新,这个JS变量也会跟着更新, 一般的input需要定义成这种对象。
  3. ObservableArray对应数组的双向绑定,适用对Checkbox等多选的对象。

b. 声明JSON为View Model对象

   var initialData = [{firstName: "Danny",lastName: "LaRusso",id:"C6A2D391-6B68-42EA-9EE2-3E25756143C2", phones: [{ type: "Mobile",number: "(555) 121-2121", id:"C6A2D391-6B68-42EA-9EE2-3E25756143C1" },{ type: "Home", number:"(555) 123-4567", id:"C6A2D391-6B68-42EA-9EE2-3E25756143C5" }]},{firstName: "Sensei",lastName: "Miyagi", id:"C6A2D391-6B68-42EA-9EE2-3E2575614334", phones: [{ type: "Mobile",number: "(555) 444-2222", id:"C6A2D391-6B68-42EA-9EE2-3E25756143C20" },{ type: "Home", number:"(555) 999-1212", id:"C6A2D391-6B67-42EA-9EE2-3E25756143C2" }]}];var ContactsModel = function (contacts) {var self = this;self.contacts =ko.observableArray(ko.utils.arrayMap(contacts, function (contact) {return {firstName:ko.observable(contact.firstName),lastName:ko.observable(contact.lastName),id: contact.id,phones:ko.observableArray(ko.utils.arrayMap(contact.phones, function (phone) {return {type2:ko.observable(phone.type),number2:ko.observable(phone.number),id: phone.id}}))};}));
}

KO提供了Ko.utils类库来支持一些基本的操作,比如ko.utils.arrayMap相当于$.each,可以对数组里面的对象逐个绑,在多层结构的JSON或数据非常有用。这种方式相当于手动绑定JSON对象里面的元素,可以过滤掉不用的,也可以重命名。如果整个JSON都需要用,不需要过滤,而且不需要重命名,可以用KO的Mapping插件,非常方便。一开始不知道有这个Mapping插件,写了很多手动匹配的代码。。。

  1. 数据绑定

定义好数据,接下来就是绑定到HTML作用域了。使用applyBindings方法,第一个参数是ViewModel,第二个参数是HTML的节点,这里注意下,如果第二个参数不指定或指定的DOM对象不存在,都会绑定为全局的作用域。

 ko.applyBindings(newContactsModel(initialData), document.getElementById("contactsList"));
  1. HTML  View层

这也是KO的核心部分之一,KO定义了很多常用的Bindings,针对HTML 标签,属性,CSS样式,事件,所有的绑定行为写在Data-bind属性里,也可以写在注释<!-- -->里(这个非常有用)。有了View层的binding, 所有的逻辑都能够很显式的在HTML里找到,enable/disable,visible/invisible, click/textInput, if/ifnot等等,比起jQuery把所有的行为写在js里,HTML完全看不出来有哪些逻辑直观很多。

<divid='contactsList'><table class='contactsEditor'><thead><tr><td>First name</td><td>Last name</td><td>Operation</td></thead><tbodydata-bind="foreach: contacts">  <!-- foreach 绑定--><tr><td><inputdata-bind="value: firstName" class="form-control" />   <!-- value 绑定--></td><td><inputdata-bind='value: lastName' class="form-control" /></td><td><buttonclass="btn btn-warning" data-toggle="modal"data-target="#updateContact" data-bind="click:$root.updateContactInit.bind(this,firstName,lastName,id)">Update acontact</button>    <!-- click事件绑定--><buttondata-bind='click: $root.removeContact' class="btnbtn-warning">Delete Contact</button></td></tr></tbody></table>
</div>

Binding的使用在KO的官网都有解释 http://knockoutjs.com/documentation/introduction.html, 个人觉得比Tom大叔讲的要明白很多。

Note:

  1. click: $root.removeContact, 这个绑定会把当前层的Ko对象作为参数传递给removeContact方法,如果想要传递多个参数,可以使用bind方法,例如$root.updateContactInit.bind(this,firstName,lastName,id)
  2. checked绑定对于checkbox非常有用,只需声明个数组 this.checkedList= ko.observableArray(); 然后在HTML绑定时指定value和checked就能实现多选,不需要很复杂的代码:databind="value: Id, checked: checkedList", checkedList取到的就是选中的Id列表。
  3. Input标签使用textInput 绑定而不是value, textInput在值改变的时候就能触发, value要等到keydown才行。

最后就是KO的一个带2层数据的CRUD例子,官网上的例子是直接在input里修改,实际项目很少这么做,一般都是弹出框修改,所以我把它改成了bootstrap的popupmodel:http://jsbin.com/bahofu/ ,里面的updatePhone方法留给大家思考。

Reference:

http://blog.nebithi.com/knockoutjs-vs-angularjs/

http://knockoutjs.com/documentation/introduction.html

http://knockoutjs.com/examples/

KnockoutJS 实例相关推荐

  1. 前端开发基础知识汇总

    一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...

  2. Spring Cloud微服务系统架构的一些简单介绍和使用

    Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...

  3. knockoutjs ajax分页,KnockoutJS 3.X API 第四章之数据控制流foreach绑定

    foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM- ...

  4. php android 复制粘贴板,Android_Android剪贴板用法详解,本文实例详述了Android剪贴板的 - phpStudy...

    Android剪贴板用法详解 本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管 ...

  5. MVVM js 库JsRender/JsViews和knockoutjs介绍

    MVVM概念 MVVM的解释有很多,抛开抽象的描叙我想最实用的一点是把UI和数据绑定,事件做成了一种静态契约,也就是模版,同时UI和数据可以独立动态变化.WPF,SL相对Winfrom和asp.net ...

  6. MVVM架构~Knockoutjs系列之text,value,attr,visible,with的数据绑定

    Knockoutjs是微软mvc4里一个新东西,用这在MVC环境里实现MVVM,小微这次没有大张旗鼓,而是愉愉的为我们开发者嵌入了一个实现MVVM的插件,这下面的几篇文章中,我和大家将一起去探讨它, ...

  7. KnockoutJS的使用及分析

    knockoutJS使用及分析 首先,为了不要让这篇文章是纯文字的,我去了knockout的官网顺了个logo过来-- 官网 之前的学习中碰上了SPA应用,刚好老师使用了学习成本低的KnockoutJ ...

  8. knockoutjs介绍(译文)

    介绍 knockoutjs 是一个能够帮助你创建一个具有干净基础数据模型的丰富.响应的显示和编辑器用户界面的一个JavaScript库. 任何时候,动态更新UI的部分(例如,根据用户的行为而改变或当外 ...

  9. JS组件系列——KnockoutJS用法

    前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...

  10. ECS(Linux)连接RDS,使用命令行方式连接实例

    使用命令行方式连接实例 通过命令行连接RDS MySQL数据库,连接方式如下: mysql -h<连接地址> -P<端口> -u<用户名> -p -D<数据库 ...

最新文章

  1. 电梯为什么显示停止服务器,教你奥的斯服务器怎么看故障
  2. 如何让AI机器人的对话更加自然?
  3. CString 在_UNICODE宏定义下和普通ASCII编码下的不同
  4. 为何 short s1 = 1; 是对的,而 float f=3.4; 是错的?
  5. 关于this的指向问题
  6. 停止复制代理后AWT缓存组的行为
  7. php 画布插入图像,javascript – 如何在PHP中将html5画布图像保存到数据库
  8. 详解java集合之ArrayList——底层实现是一个Object数组。分析ArrayList的自动扩容,原来不一定是1.5倍
  9. 专门用来显示大量数据的视图:AdapterView(1)
  10. 详解Bitmap之ARGB_8888/RGB_565/ALPHA_8/ARGB_4444
  11. .Net程序员面试 中级篇 (回答Scott Hanselman的问题)
  12. 【算法导论】第7章快速排序
  13. NUS 联合 Sea AI Lab 发表 Multi-view Pose Transformer,完全端到端学习,超强可扩展性...
  14. 解决plsql中中文乱码问题
  15. spss clementine Twostep Cluster(两步聚类 二阶聚类)
  16. 【浙江大学PAT真题练习乙级】1005 继续(3n+1)猜想 (25分) 真题解析
  17. 链表常见算法题总结(Java)
  18. android利用数字证书对程序签名
  19. 使用MAKER进行全基因组基因注释-基础篇
  20. 用大数据文本挖掘来看“共享单车”的行业现状及走势

热门文章

  1. 计算机测试性评估,计算机CPU性能评估软件PCMark
  2. 【Python脚本进阶】2.4、conficker蠕虫(上):Metasploit攻击Windows SMB服务
  3. 配置alexa skill(二)
  4. cocos2dx 基础
  5. Java 代理中转下载 url 文件
  6. 经济应用文写作【8】
  7. linux用户配额管理,—linux 磁盘配额按用户管理(quota)
  8. fedora 14 root登陆修改方法
  9. MATLAB程序:S-V信道模型
  10. 话筒在multisim怎么找_基于Multisim软件的调频无线话筒仿真