这篇文章主要用于记录学习Working with observable arrays的测试和体会。

Observable主要用于单一个体的修改订阅,当我们在处理一堆个体时,当UI需要重复显示一些样式相同的元素时,这些数据的绑定就需要依靠observable arrays。

特别需要注意的一点是,observable arrays关注的是数组中元素整体的变化(包括增加元素,删减元素,元素顺序的改变等等),而不是元素个体的变化(元素内部某些部分的改变)。

我们可以在js文件中创建一个observable array并初始化其中的一些元素:

 var myObservableArray = ko.observableArray([
  { firstName: "Kazusa", lastName: "Touma" },
3   { firstName: "Chiaki", lastName: "Izumi" },
  { firstName: "Yuki", lastName: "Nagato" }
]);

按照文档的原话:an obversableArray is actually an observable whose value is an array。也就是说一个observableArray实际上就是一个observable,只不过这个observable的值是一个数组,而不是一个字符串或是数字等其他类型。在上一篇文章中,我们也可以观察到,在调用或者是修改observable的值的时候,我们要把它当做一个函数来使用,即在identifier之后要增加一个括号,这一法则也适用于observableArray(毕竟它本质上就是一个observable,事实上我在想为什么knockout不直接把observableArray的构造函数整合到observable之中去,可能是考虑到所有的方法不一样吧,也可能是为了在概念上更为清晰一些)。为了获取和修改observableArray的值或是其中的元素,我们创建了几个p元素用于显示:

 <p>The length of observableArray is: <span id="lengthOfArray"></span></p>
<p>The second element of observableArray is: <span id="secondElement"></span></p>
<p>The changed element: <span id="changedElement"></span></p>

而在js文件中,我们做了以下操作:

 $("#lengthOfArray").text(myObservableArray().length);
$("#secondElement").text(myObservableArray()[1].firstName);
myObservableArray()[2].lastName = "Charlie";
$("#changedElement").text(myObservableArray()[2].lastName);

最后页面显示如下:

一般说来,我们能够使用类似javascript中的最基本的数组操作方法来对observableArray进行操作,但是KO的observableArray拥有更为强大的特性,归纳为以下三点:

  1. 它们能够在所有浏览器上使用(例如javascript的indexof方法不能再IE8以前的浏览器上使用,而KO的indexof方法则可以使用)。
  2. 对于修改数组内容的方法,比如push或是splice,KO的方法会自动触发依赖跟踪机制并使得所有的订阅者和UI进行自动的改变。
  3. KO的方法在调用起来更为简洁,比如push方法只需要写成myObservableArray.push(...)而不是原先的myObservableArray().push(...)。

对于第三条我是存在一些疑问的:哪些方法可以省略括号,哪些方法不能省略括号呢?(至少length就不能,大概是因为length算作属性而不算方法的原因?)目前基本猜测是方法可以省略括号,而属性或元素不行。

之后的文档主要介绍的是读写数组信息所能用到的一些函数。为了能够更为直观地展现我的observableArray数组,我对js文件做了以下修改:

 var i, length;
for (i = 0, length = myObservableArray().length; i < length; i++) {
  $("<p></p>").appendTo($("p:last"));
  $("p:last").text("First Name: " + myObservableArray()[i].firstName + "; Last Name: " + myObservableArray()[i].lastName);
}

Indexof方法可以返回数组中等于你所提供的参数的第一个元素的索引值,如果数组中不存在满足条件的元素,则返回-1,相应的js部分如下:

 $("#indexOfChiaki").text(myObservableArray.indexOf("Chiaki"));
$("#indexOfCharlie").text(myObservableArray.indexOf("Charlie"));

相应的html部分如下:

 <p>The index of Chiaki is: <span id="indexOfChiaki"></span></p>
<p>The index of Charlie is: <span id="indexOfCharlie"></span></p>

效果如下:

Slice方法用于返回数组中指定范围的元素值(如果省略第二个参数,则默认从第一个参数的位置到数组结尾),相应的js部分如下:

 $("#testForSlice").text(myObservableArray.slice(2, 5));

相应的html部分如下:

 <p>Test for slice function: <span id="testForSlice"></span></p>

效果如下:

假定我们的observableArray的元素就以上图为初始状态,接下来对pop、push、shift等方法进行测试。每个方法的效果图都在左边附加了原先的数组样式。

push用于在数组末尾添加指定的元素,相应的js部分如下:

 myObservableArray.push("Charlie");

效果如下:

pop方法用于删除并返回数组的最后一个元素,相应的js部分如下:

 var test = myObservableArray.pop();
alert(test);

效果如下:

unshift方法用于在数组首部添加一个指定的元素,相应的js部分如下:

 myObservableArray.unshift("Charlie");

效果如下:

shift方法用于删除并返回数组开头的元素,相应的js部分如下:

 var test = myObservableArray.shift();
alert(test);

效果如下:

reverse方法用于倒置数组的顺序,相应的js部分如下:

 myObservableArray.reverse();

效果如下:

sort方法用于对数组进行排序,默认的排序规则是按照字母的顺序排序,相应的js部分如下:

 myObservableArray.sort();

效果如下:

另外,sort方法也可以自定义排序的方式,比如自定义一个按字母倒序排列的方法:

 myObservableArray.sort(function(left, right) {
  return left === right ? 0 : (left < right ? 1 : -1);
});

效果如下:

关于sort自定义的排序方法,我是有一点疑问的,提供给function的两个参数left和right是怎样实现排序的?比较后所需要返回的正负数值又是如何应用到排序中去的?也许这些可以从knockout的源代码中找到答案,可留作以后研究。

splice方法删除并返回数组中从指定位置开始的指定数量的元素,它的第一个参数是指定的index的值,第二个参数则是需要删除的元素个数,相应的js部分如下:

 var test = myObservableArray.splice(1, 3);
alert(test);

效果如下:

对于更为详尽的array方面可以使用的方法,MDN上有详尽的文档。

以下的方法都是javascript的默认方法中所没有的KO的新方法。

为了能够测试remove等方法的效果,我将数组元素变成如下形式:

remove方法可以删除等于指定值的元素并将它们以数组的方式返回,相应的js部分如下:

 var test = myObservableArray.remove("Chiaki");
alert(test);

效果如下:

也可以在remove中自定义删除的条件,相应的js部分如下:

 var test = myObservableArray.remove(function(item) {
  return item.length <= 5;
});
alert(test);

效果如下:

removeAll方法用于删除等于指定数组中某一元素的元素并将其以数组的方式返回,相应的js部分如下:

 var test = myObservableArray.removeAll(["Chiaki", "Kazusa", "Charlie"]);
alert(test);

效果如下:

如果在removeAll方法中不添加参数,则将会删除整个数组并返回,这里不再演示。

由于destroy和destroyAll方法主要是与Ruby和Rails开发相关,可以留作以后研究。

同样的,observableArray也可以调用extend方法中的rateLimit属性来指定延时,留作之后激活bindings时再测试。

KnockoutJs学习笔记(二)的更多相关文章

  1. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  2. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  3. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  4. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  5. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  6. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  7. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  8. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Redis学习笔记二 (BitMap算法分析与BitCount语法)

    Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...

随机推荐

  1. ACF/PACF,残差白噪声的检验问题

    关于自相关.偏自相关: 一.自协方差和自相关系数       p阶自回归AR(p)       自协方差 r(t,s)=E[X(t)-EX(t)][X(s)-EX(s)]       自相关系数ACF ...

  2. Docker应用一:docker介绍

    Docker介绍与安装 一.Docker与传统虚拟化区别 直接看下图:                  传统虚拟化实现架构                                   doc ...

  3. 「Vue」程序式路由导航用法

    1.button发起点击请求<mt-button type='primary' size='large' plain @click="topdcmt(id)">商品评论 ...

  4. U45490 还没想好名字的题Ⅱ

    这一题的环状板 Solution 暴力断环为链, 枚举起点跑 \(n\) 遍 \(DP\), 取最小值即可 Code #include<iostream> #include<cstd ...

  5. mongodb_修改器($inc/$set/$unset/$push/$pop/upsert)

    转自 https://blog.csdn.net/mcpang/article/details/7752736   对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够 ...

  6. Hadoop基础-MapReduce的工作原理第一弹

    Hadoop基础-MapReduce的工作原理第一弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在本篇博客中,我们将深入学习Hadoop中的MapReduce工作机制,这些知识 ...

  7. 调用weka模拟实现 “主动学习“ 算法

    主动学习: 主动学习的过程:需要分类器与标记专家进行交互.一个典型的过程: (1)基于少量已标记样本构建模型 (2)从未标记样本中选出信息量最大的样本,交给专家进行标记 (3)将这些样本与之前样本进行 ...

  8. CSS3实战之resize

    resize属性可以设置是否允许用户缩放网页中元素的大小 总共有4种取值 none vertical horizontal both 举个栗子 <!DOCTYPE html PUBLIC &qu ...

  9. Web Api问题汇总

    在公网上布署Web Api的时候,不能调用,返回404 在web.config中 Adding the following to the web.config file worked for me: ...

  10. JS对象中的原型

    对象的原型:每个对象都连接一个原型对象,并且它可以从中继承属性.所有通过对象字面量创建的对象都连接到object.prototype.当你创建一个新对象时,你可以选择某个对象作为它的原型.原型连接在更 ...