KnockoutJS 实例
最近开始用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的页面:
- 数据
KO提供了灵活的方式支持对JS的对象定义在View Model,然后绑定到HTML元素上,View Model里面的值和 HTML上面的元素相匹配。
- 声明普通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:
- 普通的赋值适用于值不变的对象,适用于Lable等
- Observable代表双向绑定,也就是界面的DOM对象更新,这个JS变量也会跟着更新, 一般的input需要定义成这种对象。
- 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插件,写了很多手动匹配的代码。。。
- 数据绑定
定义好数据,接下来就是绑定到HTML作用域了。使用applyBindings方法,第一个参数是ViewModel,第二个参数是HTML的节点,这里注意下,如果第二个参数不指定或指定的DOM对象不存在,都会绑定为全局的作用域。
ko.applyBindings(newContactsModel(initialData), document.getElementById("contactsList"));
- 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:
- click: $root.removeContact, 这个绑定会把当前层的Ko对象作为参数传递给removeContact方法,如果想要传递多个参数,可以使用bind方法,例如$root.updateContactInit.bind(this,firstName,lastName,id)
- checked绑定对于checkbox非常有用,只需声明个数组 this.checkedList= ko.observableArray(); 然后在HTML绑定时指定value和checked就能实现多选,不需要很复杂的代码:databind="value: Id, checked: checkedList", checkedList取到的就是选中的Id列表。
- 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 实例相关推荐
- 前端开发基础知识汇总
一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...
- Spring Cloud微服务系统架构的一些简单介绍和使用
Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...
- knockoutjs ajax分页,KnockoutJS 3.X API 第四章之数据控制流foreach绑定
foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM- ...
- php android 复制粘贴板,Android_Android剪贴板用法详解,本文实例详述了Android剪贴板的 - phpStudy...
Android剪贴板用法详解 本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管 ...
- MVVM js 库JsRender/JsViews和knockoutjs介绍
MVVM概念 MVVM的解释有很多,抛开抽象的描叙我想最实用的一点是把UI和数据绑定,事件做成了一种静态契约,也就是模版,同时UI和数据可以独立动态变化.WPF,SL相对Winfrom和asp.net ...
- MVVM架构~Knockoutjs系列之text,value,attr,visible,with的数据绑定
Knockoutjs是微软mvc4里一个新东西,用这在MVC环境里实现MVVM,小微这次没有大张旗鼓,而是愉愉的为我们开发者嵌入了一个实现MVVM的插件,这下面的几篇文章中,我和大家将一起去探讨它, ...
- KnockoutJS的使用及分析
knockoutJS使用及分析 首先,为了不要让这篇文章是纯文字的,我去了knockout的官网顺了个logo过来-- 官网 之前的学习中碰上了SPA应用,刚好老师使用了学习成本低的KnockoutJ ...
- knockoutjs介绍(译文)
介绍 knockoutjs 是一个能够帮助你创建一个具有干净基础数据模型的丰富.响应的显示和编辑器用户界面的一个JavaScript库. 任何时候,动态更新UI的部分(例如,根据用户的行为而改变或当外 ...
- JS组件系列——KnockoutJS用法
前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...
- ECS(Linux)连接RDS,使用命令行方式连接实例
使用命令行方式连接实例 通过命令行连接RDS MySQL数据库,连接方式如下: mysql -h<连接地址> -P<端口> -u<用户名> -p -D<数据库 ...
最新文章
- 电梯为什么显示停止服务器,教你奥的斯服务器怎么看故障
- 如何让AI机器人的对话更加自然?
- CString 在_UNICODE宏定义下和普通ASCII编码下的不同
- 为何 short s1 = 1; 是对的,而 float f=3.4; 是错的?
- 关于this的指向问题
- 停止复制代理后AWT缓存组的行为
- php 画布插入图像,javascript – 如何在PHP中将html5画布图像保存到数据库
- 详解java集合之ArrayList——底层实现是一个Object数组。分析ArrayList的自动扩容,原来不一定是1.5倍
- 专门用来显示大量数据的视图:AdapterView(1)
- 详解Bitmap之ARGB_8888/RGB_565/ALPHA_8/ARGB_4444
- .Net程序员面试 中级篇 (回答Scott Hanselman的问题)
- 【算法导论】第7章快速排序
- NUS 联合 Sea AI Lab 发表 Multi-view Pose Transformer,完全端到端学习,超强可扩展性...
- 解决plsql中中文乱码问题
- spss clementine Twostep Cluster(两步聚类 二阶聚类)
- 【浙江大学PAT真题练习乙级】1005 继续(3n+1)猜想 (25分) 真题解析
- 链表常见算法题总结(Java)
- android利用数字证书对程序签名
- 使用MAKER进行全基因组基因注释-基础篇
- 用大数据文本挖掘来看“共享单车”的行业现状及走势