Knockoutjs快速入门(经典)

 更新时间:2012年12月24日 17:45:05   转载 作者:  
Knockoutjs是一个JavaScript实现的MVVM框架.主要有如下几个功能1. Declarative bindings2. Observables and dependency tracking3. Templating,需要了解的朋友可以参考下

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那代码必须在页面全部加载完之后执行。页面显示为:

image

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

复制代码 代码如下:

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

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

image

下面再看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也会自动跟着变更。

image

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

复制代码 代码如下:

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

在页面上添加一个按钮:
复制代码 代码如下:

<button data-bind="click: capitalizeLastName">Caps</button>

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

image 

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>

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

image

下面给订单加上增删产品的功能,先给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大大简化。

image

相关文章

  • JavaScript入门之语言基础

    JavaScript入门之语言基础

    本文通过全面列举基础的JavaScript概念这一方式来阐述该语言的基本原理,以此来为初学者提供一个对语言的基本了解,随处可见的代码例子则是用来说明所有的这些概念是如何在语言中体现出来的
    2011-10-10
  • js变量、作用域及内存详解

    js变量、作用域及内存详解

    本文主要详细分析了JS变量,作用域以及内存问题,同时附上非常多的实例,方便大家理解这3个概念,是篇不可多得的文章,希望对大家有所帮助
    2014-09-09
  • JavaScript中利用各种循环进行遍历的方式总结

    JavaScript中利用各种循环进行遍历的方式总结

    这篇文章主要介绍了JavaScript中利用各种循环进行遍历的方式总结,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • JavaScript基本对象

    JavaScript基本对象

    JavaScript基本对象...
    2007-01-01
  • 图解prototype、proto和constructor的三角关系

    图解prototype、proto和constructor的三角关系

    在javascript中,prototype、constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备忘,有不对之处还望斧正。
    2016-07-07
  • JavaScript语言核心数据类型和变量使用介绍

    JavaScript语言核心数据类型和变量使用介绍

    和众多编程语言一样,JavaScript也有自己语言的核心,了解并学好JavaScript的语言核心部分是JavaScript学习道路上非常良好的开始
    2013-08-08
  • javascript setTimeout和setInterval 的区别

    javascript setTimeout和setInterval 的区别

    window对象有两个主要的定时方法,分别是setTimeout 和 setInteval 他们的语法基本上相同,但是完成的功能取有区别。
    2009-12-12
  • 详解JavaScript ES6中的Generator

    详解JavaScript ES6中的Generator

    这篇文章主要介绍了详解JavaScript ES6中的Generator,ES6版本的JS带来了诸多简洁化的改善,需要的朋友可以参考下
    2015-07-07
  • JavaScript函数模式详解

    JavaScript函数模式详解

    文章对javascript的四种函数模式进行了详细的解释,并附上示例,方便小伙伴们理解并应用,希望对大家能有所帮助。
    2014-11-11
  • 什么是JavaScript

    什么是JavaScript

    JavaScript是一种基于对象和事件驱动的客户端脚本语言。JavaScript最初的设计是为了检验HTML表单输入的正确性。javaScript起源于Netscape公司的LiveScript语言。
    2009-08-08

最新评论