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压缩利器
Feb 20 Javascript
有关DOM元素与事件的3个谜题
Nov 11 Javascript
JavaScript 语言基础知识点总结(思维导图)
Nov 10 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
Aug 21 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
Angular 应用技巧总结
Sep 14 Javascript
详解用vue-cli来搭建vue项目和webpack
Apr 20 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
微信小程序简单实现form表单获取输入数据功能示例
Nov 30 Javascript
使用命令行工具npm新创建一个vue项目的方法
Dec 27 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
Jan 14 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执行速度全攻略(下)
2006/10/09 PHP
用ODBC的分页显示
2006/10/09 PHP
PHP里的中文变量说明
2011/07/23 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
JavaScript简单表格编辑功能实现方法
2015/04/16 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
分享6个隐藏的python功能
2017/12/07 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
2014年应届大学生自我评价
2014/01/09 职场文书
安全检查管理制度
2014/02/02 职场文书
保护环境倡议书500字
2014/05/19 职场文书
个人买房协议书范本
2014/10/06 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
简历中自我评价范文
2015/03/11 职场文书
校长一岗双责责任书
2015/05/09 职场文书