Knockoutjs快速入门(经典)


Posted in Javascript onDecember 24, 2012

Knockoutjs是一个JavaScript实现的MVVM框架。主要有如下几个功能:

1. Declarative bindings

2. Observables and dependency tracking

3. Templating

它对于分离前台的业务逻辑和视图简化数据绑定过程有显著的作用。闲言少叙,直接看例子,如何下载也不说了,如果用VS开发的话用Nuget就可以一键搞定。

1.基本绑定和依赖跟踪
首先需要定义一个ViewModel:

<script type="text/javascript"> 
function ViewModel() { 
this.firstName = "Zixin"; 
this.lastName = "Yin"; 
} 
</script>

然后是一个用来显示这个ViewModel的View:
<div> 
<p data-bind="text: firstName"></p> 
<p data-bind="text: firstName"></p> 
<input data-bind="value: firstName"/> 
<input data-bind="value: lastName"/> 
</div>

从这个view中可以看到声明式绑定的含义,只需要在标签上使用data-bind属性,就可以将数据的值绑定到相应的地方。有了View和ViewModel还需要代码将这两者关联起来:
ko.applyBindings(new ViewModel());

将他们放到一起,注意,applyBinding那代码必须在页面全部加载完之后执行。页面显示为:

Knockoutjs快速入门(经典)

下面再看observables,这个功能不是与生俱来的,必须要把View Model设置为observable,方法如下:

function ViewModel() { 
this.firstName = ko.observable("Zixin"); 
this.lastName = ko.observable("Yin"); 
}

其他都不需要改变,这时候,如果改变输入框中的值,当焦点离开的时候,可以发现p中的值也跟着改变了:

Knockoutjs快速入门(经典)

下面再看dependency tracking,也就是如果一个值依赖多各值,其中任何一个值发生变化,它都会自动发生变化. 这是通过computed方法实现的,代码如下:

function ViewModel() { 
this.firstName = ko.observable("Zixin"); 
this.lastName = ko.observable("Yin"); 
this.fullName = ko.computed(function () { return this.lastName() + " " + this.firstName(); },this); 
}

注意获得一个observable的值是一个函数调用。这样当first 或者last name发生变更的时候fullName也会自动跟着变更。

Knockoutjs快速入门(经典)

也可以通过代码改变observable的值,页面会自动刷新:

function ViewModel() { 
//……… 
this.capitalizeLastName = function () { 
this.lastName(this.lastName().toUpperCase()); 
} 
}

在页面上添加一个按钮:
<button data-bind="click: capitalizeLastName">Caps</button>

点击按钮之后便会出发viewmodel的capitalizeLastName方法,要改变一个observable的值的方法就是将新值作为函数调用的参数。点击之后:

Knockoutjs快速入门(经典) 

2. 列表绑定

加入我们有如下的订单ViewModel,使用observableArray来跟踪数组的变化。

var products=[{name:"Thinkpad X1",price:9000}, 
{name:"Hp ProBook",price:5555}, 
{name:"Mouse",price:45} ]; function Order() { 
var self = this; 
self.items = ko.observableArray([ 
//This data should load from server 
new Item(products[0], 1), 
new Item(products[1],2)]); 
self.price = ko.computed(function () { 
var p=0; 
for (var i = 0; i < self.items().length; i++) { 
var item = self.items()[i]; 
p += item.product.price * item.amount(); 
} 
return p; 
}, self); 
}

Order里面的Item实际上应该是从服务器获得的,Item定义如下:
function Item(product, amount) { 
var self = this; 
this.product = product; 
this.amount = ko.observable(amount); 
this.subTotal = ko.computed(function () { 
return self.amount() * self.product.price; 
}, self); 
}

ViewModel准备好之后,就可以实现View。这次需要使用foreach绑定,如下:
<table> 
<thead> 
<tr> 
<td>Name</td> 
<td>Amount</td> 
<td>Price</td> 
</tr> 
</thead> 
<tbody data-bind="foreach: items"> 
<tr> 
<td data-bind="text: product.name"></td> 
<td><select data-bind="options:[1,2,3,4,5,6],value: amount"></select></td> 
<td data-bind="text: subTotal"></td> 
</tr> 
</tbody> 
</table> 
<h3>Order Price:<span data-bind="text: price"></span></h3>

这样一个基本的订单页面就好了,能够选择数量,价格会自动更新:

Knockoutjs快速入门(经典)

下面给订单加上增删产品的功能,先给Order加上如下的方法:

function Order() { 
//…… 
self.remove = function (item) { 
self.items.remove(item); 
} self.addMouse = function () { 
self.items.push(new Item(products[2],1)); 
} 
}

给表格加上一列删除按钮
<td><a href="#" data-bind="click: $root.remove">Remove</a></td>

再在表格底部加上一个增加产品的按钮:
<button data-bind="click: addMouse">Add a Mouse</button>

这时候,observableArray的功能就体现了,当你点击删除按钮或者底部的按钮的时候,页面节点会跟着变化,而不需要手动更新DOM节点,这使得前端的JS大大简化。

Knockoutjs快速入门(经典)

Javascript 相关文章推荐
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
xml转json的js代码
Aug 28 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
Aug 19 Javascript
node.js中的require使用详解
Dec 15 Javascript
js实现同一页面多个运动效果的方法
Apr 10 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
一览画面点击复选框后获取多个id值的方法
May 30 Javascript
Google Maps基础及实例解析
Aug 06 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
May 10 Javascript
javascript单张多张图无缝滚动实例代码
May 10 Javascript
Underscore.js 的模板功能介绍与应用
Dec 24 #Javascript
javascript 星级评分效果(手写)
Dec 24 #Javascript
Jquery写一个鼠标拖动效果实现原理与代码
Dec 24 #Javascript
jquery限制输入字数,并提示剩余字数实现代码
Dec 24 #Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
Dec 23 #Javascript
ajax中get和post的说明及使用与区别
Dec 23 #Javascript
javascript 全选与全取消功能的实现代码
Dec 23 #Javascript
You might like
如何使用脚本模仿登陆过程
2006/11/22 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
cakephp常见知识点汇总
2017/02/24 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
javascript常用的设计模式
2017/02/09 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
python监控文件并且发送告警邮件
2018/06/21 Python
python 操作excel表格的方法
2020/12/05 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
Nike香港官网:Nike HK
2019/03/23 全球购物
环境科学毕业生自荐信
2013/11/21 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
一年级学生评语
2014/04/23 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年教务工作总结
2014/12/03 职场文书
五年级学生期末评语
2014/12/26 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript