Knockout数组(observable)使用详解示例


Posted in Javascript onNovember 15, 2013

1.简单举例

<script type="text/javascript">
    var myObservableArray = ko.observableArray();  ///初始化一个空的数组
    myObservableArray.push("Some Value");          ///向数组中添加一个项
</script>

2.关键点:监控数组跟踪的是数组里的对象,而不是这些对象自身的状态。
简单说,将一对象放在observableArray 里不会使这个对象本身的属性变化可监控的。当然你自己也可以声明这个对象的属性为observable的,但它就成了一个依赖监控对象了。一个observableArray 仅仅监控他拥有的对象,并在这些对象添加或者删除的时候发出通知。
3.预加载一个监控数组observableArray
如果你想让你的监控数组在开始的时候就有一些初始值,那么在声明的时候,你可以在构造器里加入这些初始对象。例如:
var anotherObservableArray = ko.observableArray([
        { name: "Bungle", type: "Bear" },
        { name: "George", type: "Hippo" },
        { name: "Zippy", type: "Unknown" }
    ]);

4.从observableArray里读取信息
一个observableArray其实就是一个observable的监控对象,只不过他的值是一个数组(observableArray还加了很多其他特性,稍后介绍)。所以你可以像获取普通的observable的值一样,只需要调用无参函数就可以获取自身的值了。 例如,你可以像下面这样获取它的值:
alert('The length of the array is ' + myObservableArray().length);
alert('The first element is ' + myObservableArray()[0]);

理论上你可以使用任何原生的JavaScript数组函数来操作这些数组,但是KO提供了更好的功能等价函数,他们非常有用是因为:
A:兼容所有浏览器。(例如indexOf不能在IE8和早期版本上使用,但KO自己的indexOf 可以在所有浏览器上使用)
B:在数组操作函数方面(例如push和splice),KO自己的方式可以自动触发依赖跟踪,并且通知所有的订阅者它的变化,然后让UI界面也相应的自动更新。
C:语法更方便,调用KO的push方法,只需要这样写:myObservableArray.push(...)。 比如原生数组的myObservableArray().push(...)好用多了。
5.IndexOf和slice
indexOf 函数返回的是第一个等于你参数数组项的索引。例如:myObservableArray.indexOf('Blah')将返回以0为第一个索引的第一个等于Blah的数组项的索引。如果没有找到相等的,将返回-1。

slice函数是observableArray相对于JavaScript 原生函数slice的等价函数(返回给定的从开始索引到结束索引之间所有的对象集合)。 调用myObservableArray.slice(...)等价于调用JavaScript原生函数(例如:myObservableArray().slice(...))。
6.操作observableArray
observableArray 展现的是数组对象相似的函数并通知订阅者的功能。
pop, push, shift, unshift, reverse, sort, splice
所有这些函数都是和JavaScript数组原生函数等价的,唯一不同的数组改变可以通知订阅者:

myObservableArray.push('Some new value');// 在数组末尾添加一个新项
myObservableArray.pop();// 删除数组最后一个项并返回该项
myObservableArray.unshift('Some new value');// 在数组头部添加一个项
myObservableArray.shift();// 删除数组头部第一项并返回该项
myObservableArray.reverse();// 翻转整个数组的顺序
myObservableArray.sort();// 给数组排序

默认情况下,是按照字符排序(如果是字符)或者数字排序(如果是数字)。
   你可以排序传入一个排序函数进行排序,该排序函数需要接受2个参数(代表该数组里需要比较的项),如果第一个项小于第二个项,返回-1,大于则返回1,等于返回0。例如:用lastname给person排序,你可以这样写:
    myObservableArray.sort(
        function(left, right) {
            return left.lastName == right.lastName ? 0 : (left.lastName < right.lastName ? -1 : 1);
        });
 

myObservableArray.splice() 删除指定开始索引和指定数目的数组对象元素。例如myObservableArray.splice(1, 3) 从索引1开始删除3个元素(第2,3,4个元素)然后将这些元素作为一个数组对象返回。
更多observableArray 函数的信息,请参考等价的JavaScript数组标准函数。
7.remove和removeAll
observableArray 添加了一些JavaScript数组默认没有但非常有用的函数:
myObservableArray.remove(someItem);// 删除所有等于someItem的元素并将被删除元素作为一个数组返回
myObservableArray.remove(function (item) { return item.age < 18;}) ;//删除所有age属性小于18的元素并将被删除元素作为一个数组返回
Javascript 相关文章推荐
js控制表单操作的常用代码小结
Aug 15 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
Sep 16 Javascript
jquery使用append(content)方法注意事项分享
Jan 06 Javascript
Jquery实现图片预加载与延时加载的方法
Dec 22 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
canvas实现图像放大镜
Feb 06 Javascript
《javascript少儿编程》location术语总结
May 27 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
Oct 12 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
亲自动手实现vue日历控件
Jun 26 Javascript
图片上传插件jquery.uploadify详解
Nov 15 #Javascript
JQuery获取或设置ckeditor的数据(示例代码)
Nov 15 #Javascript
Json和Jsonp理论实例代码详解
Nov 15 #Javascript
JS简单实现文件上传实例代码(无需插件)
Nov 15 #Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
Nov 15 #Javascript
简洁Ajax函数处理(示例代码)
Nov 15 #Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 #Javascript
You might like
php 设计模式之 工厂模式
2008/12/19 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
js jquery做的图片连续滚动代码
2008/01/06 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
JS中的BOM应用
2018/02/02 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
详解python中requirements.txt的一切
2017/03/03 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
django celery redis使用具体实践
2019/04/08 Python
python程序 创建多线程过程详解
2019/09/23 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
公司司机岗位职责
2014/02/07 职场文书
承诺书模板
2014/08/30 职场文书
整脏治乱工作简报
2015/07/21 职场文书
物业公司管理制度
2015/08/05 职场文书
优秀员工演讲稿
2019/06/21 职场文书
导游词之南京中山陵
2019/11/27 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL
Golang二维数组的使用方式
2021/05/28 Golang
详解JVM系列之内存模型
2021/06/10 Javascript
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python