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 相关文章推荐
Extjs学习笔记之四 工具栏和菜单
Jan 07 Javascript
在JavaScript中操作时间之setYear()方法的使用
Jun 12 Javascript
深入学习jQuery Validate表单验证
Jan 18 Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 Javascript
jQuery使用正则表达式限制文本框只能输入数字
Jun 18 Javascript
jQuery实现简单的tab标签页效果
Sep 12 Javascript
JS中的phototype详解
Feb 04 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
详解js创建对象的几种方法及继承
Apr 12 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
Jul 01 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 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
一个程序下载的管理程序(一)
2006/10/09 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
快速入门Vue
2016/12/19 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
python的即时标记项目练习笔记
2014/09/18 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
Apache部署Django项目图文详解
2019/07/30 Python
python每天定时运行某程序代码
2019/08/16 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
人事专员工作职责
2014/02/22 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Go语言基础函数基本用法及示例详解
2021/11/17 Golang