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 相关文章推荐
javascript 伪数组实现方法
Oct 11 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
使用javascript控制cookie显示和隐藏背景图
Feb 12 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
JavaScript——DOM操作——Window.document对象详解
Jul 14 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
vue-cli实现多页面多路由的示例代码
Jan 30 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 Javascript
微信小程序使用字体图标的方法
May 23 Javascript
原生JS实现贪吃蛇小游戏
Mar 09 Javascript
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
图片上传插件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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
php SQL Injection with MySQL
2011/02/27 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
python里dict变成list实例方法
2019/06/26 Python
对python 调用类属性的方法详解
2019/07/02 Python
python实现批量命名照片
2020/06/18 Python
介绍一下Java的安全机制
2012/06/28 面试题
介绍下static、final、abstract区别
2015/01/30 面试题
教你怎样写好自我评价
2013/10/05 职场文书
计算机个人求职信范例
2014/01/24 职场文书
营销与策划专业求职信
2014/06/20 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
群众路线剖析材料
2014/09/30 职场文书
2014年保育员工作总结
2014/12/02 职场文书
军训个人总结
2015/03/03 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
MySQL创建定时任务
2022/01/22 MySQL