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 相关文章推荐
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
javascript模拟地球旋转效果代码实例
Dec 02 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
js检测用户输入密码强度
Oct 22 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
Vue.js实现一个todo-list的上移下移删除功能
Jun 26 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
JavaScript实现短暂提示框功能
Apr 04 Javascript
原生JS实现的碰撞检测功能示例
May 18 Javascript
通过图带你深入了解vue的响应式原理
Jun 21 Javascript
vue 实现 rem 布局或vw 布局的方法
Nov 13 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通过curl模拟登陆DZ论坛
2015/05/11 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
简单了解python数组的基本操作
2019/11/26 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python接入支付宝的实例操作
2020/07/20 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
简历中个人自我评价范文
2013/12/26 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
国庆横幅标语
2014/10/08 职场文书
索赔员岗位职责
2015/02/15 职场文书
2015年档案室工作总结
2015/05/23 职场文书
小学运动会通讯稿
2015/07/18 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python