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 相关文章推荐
Javascript动态绑定事件的简单实现代码
Dec 25 Javascript
javascript+xml实现简单图片轮换(只支持IE)
Dec 23 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
javascript实现五星评价代码(源码下载)
Aug 11 Javascript
javascript 中select框触发事件过程的分析
Aug 01 Javascript
jQuery中将json数据显示到页面表格的方法
May 27 jQuery
JavaScript高级函数应用之分时函数实例分析
Aug 03 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 Javascript
初试vue-cli使用HBuilderx打包app的坑
Jul 17 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
Aug 07 Javascript
实例讲解React 组件生命周期
Jul 08 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
Oct 20 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
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
session 加入redis的实现代码
2016/07/15 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
基于Python os模块常用命令介绍
2017/11/03 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
解决Python使用列表副本的问题
2019/12/19 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
python常量折叠基础知识点讲解
2021/02/28 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
教师专业自荐信
2014/05/31 职场文书
安全环保标语
2014/06/09 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
2014年设计师工作总结
2014/11/25 职场文书
公积金具结保证书
2015/05/11 职场文书