承接前文,前文书说道了KO框架中如何使用observable的视图模型属性来与UI元素进行绑定并自动进行双向更新的事儿。observable属性除了服务基础数据类型之外,还定义了专门为服务数组类型的observableArray。

如果你想要监测并响应一个object类型的变化,那么你使用observables。如果你想监测并响应一个集合的变化,就使用observableArray。很多场景下你都会用到它,比如你要在UI上展现或者编辑一个列表内容,期中你会控制他们的展现啊,隐藏啊,添加啊,删除之类的时候,使用它吧。看看下面的demo如何定义:

 $(function () {
var myObservableArray = ko.observableArray(); // 直接定义
myObservableArray.push('Some value'); var myViewModel = {
names:ko.observableArray(); //定义在视图模型对象中
   }
});

注意: 一个observableArray只监测和跟踪集合中的对象,并不监测和跟踪集合中对象的属性,直观来讲就是只关心内部元素的更新和删除以及排序等,并不关心对象属性是否发生变化。

简单的把一个对象放入observableArray中不会让该对象的属性也变成observable。当然如果你想的话你可以将这些对象的属性定义成observable的,这就是另一回事儿了。 一个 observableArray 只是跟踪他们自己所包含的对象, 并且只会在对象增加或减少或排序的时候向监听器发送通知。

observableArray的初始化

     如果你想让你的observableArray在一开始就有值,那么可以在构造函数中直接传入一个js数组,像下面这样:

 $(function () {
var anotherObservableArray = ko.observableArray([
{ name: "Bungle", type: "Bear" },
{ name: "George", type: "Hippo" },
{ name: "Zippy", type: "Unknown" }
]);
});

     读取observableArray信息

     其实在幕后一个observableArray实际上也是一个observable数据,只不过它的值是个数组(额外的,observableArray 添加了很多自己的特性)。所以你可以像方法一样调用它就能直接到里面的javascript数组,就像其他的observable的使用方式一样。然后就可以随意处理这个js数组了。举个例子:

$(function () {
var anotherObservableArray = ko.observableArray([
{ name: "Bungle", type: "Bear" },
{ name: "George", type: "Hippo" },
{ name: "Zippy", type: "Unknown" }
]); alert('The length of the array is ' + myObservableArray().length);
alert('The first element is ' + myObservableArray()[0]);
});

从技术上来讲你可以使用任意的原生javascript数组中的方法来操作获取到的js数组,但是你也可以使用KO框架中为observableArray提供的一些等效方法来直接操作而无需转换为js数组,有时候这更有效率 ,因为:

  1. 它们支持所有浏览器. (例如,原生的javascript数组中的indexOf方法不能在IE8或更早的浏览器版本中使用,但是KO中的indexOf就能完美支持。)
  2. 其中有一些可以修改数组内容的方法比如 push和splice, 在KO中这些方法都自带自动触发和追踪机制,所以所有注册过的监听器一旦在数组内容发生变化的时候都能接收到通知,并且自动为你更新UI。
  3. 语法上也非常简单. 比如调用KO的push方法, 只需要这么写myObservableArray.push(...)。这样的话比先取出原生数组再调用原生数组的push方法要简单。(复杂的写法:myObservableArray().push(...)

下面来看看它包含的一些常见方法:

indexOf

indexOf 方法返回参数所代表的数据在数组中的索引下表,如果找到多个则只返回第一个的索引。例如:myObservableArray.indexOf('Blah') 返回数组中第一个内容为Blash的元素所代表的下表,下表从0开始。如果没有找到的话则返回-1。

slice

slice方法等效于原声javascript数组中的slice方法 (返回从你指定的起始下标位置到终止下标位置内的所有元素)。

pop, push, shift, unshift, reverse, sort, splice

这些方法都等效于原声javascirpt数组中的方法,但是他们都会向监听器发送通知,因为他们都会改变数组中的元素,包括增删排序。

  • push(value) — 添加一个新的元素到集合中。
  • pop() —删除数组中的最后一个元素并返回。
  • unshift( value ) — 在数组的开头插入一个新元素。
  • shift() — 删除数组的第一个元素并返回。
  • reverse() — 将数组中的所有元素顺序翻转并返回这个observableArray。
  • sort() — 排序数组并返回排序后的observableArray。
  • splice() — 从给定的起始索引位置删除指定数量的元素并返回这些删除的元素。示例:myObservableArray.splice(1, 3) 从位置1开始删除3个元素,并且将它们作为一个数组返回。

最后再说一下Sort:

默认的排序是按照字母进行排序的, 但是你可以传递一个函数来自定义排序规则。 你的函数需要提供两个参数,框架会将数组中的数据两两传递进去,如果你想让第一个元素排在前面,则返回一个负数,如果你想让第一个元素排在后面就返回一个正数,返回0的话相同的数据位置不变。举个例子, 通过last name排序一个 ‘person’ 集合 , 你可以这么写:myObservableArray.sort(function (left, right) { return left.lastName == right.lastName ? 0 : (left.lastName < right.lastName ? -1 : 1) })

remove 与removeAll

observableArray 添加了更多有用的方法 :

  • remove( someItem ) — 删除所有与someItem相同的值,并将它们作为数组返回。
  • remove( function (item) { return item.age < 18; } ) — 删除所有年龄小于18岁的元素,并将它们作为数组返回。
  • removeAll( ['Chad', 132, undefined] ) — 删除所有值为Chad、123、undefined的元素并将它们作为数组返回。
  • removeAll() —删除所有元素一个不留。

延迟更新通知

通常,一个observableArray内的元素发生改变时(增删排序)会立即向它的订阅者们发送通知。但是如果这个observableArray会多次重复出现,或者更新会很耗时的时候你可能会希望通过延迟通知的时间间隔来获取更好的性能体验,可以使用rateLimitextender 来完成:

myViewModel.myObservableArray.extend({ rateLimit: 50 });

好啦,我们下节见啦。

Knockoutjs官网翻译系列(二) Observable 数组的更多相关文章

  1. Knockoutjs官网翻译系列(一)

    最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架.作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯 ...

  2. Knockoutjs官网翻译系列(三) 使用Computed Observables

    书接上回,前面谈到了在视图模型中可以定义普通的observable属性以及observableArray属性实现与UI元素的双向绑定,这一节我们继续探讨第三种可实现绑定的属性类型:computed o ...

  3. Knockoutjs官网翻译系列(四) computed中依赖追踪是如何工作的

    初学者无需了解这些 ,但是很多高级程序员想知道我们为什么可以保持跟踪这些依赖以及可以正确的更新到UI中.它其实很简单.跟踪算法是这样的: 无论何时你定义了一个computed observable,K ...

  4. Knockout.Js官网学习(系列)

    1.Knockout.Js官网学习(简介) 2.Knockout.Js官网学习(监控属性Observables) Knockout.Js官网学习(数组observable) 3.Knockout.Js ...

  5. 【工利其器】必会工具之(三)systrace篇(1)官网翻译

    前言 Android 开发者官网中对systrace(Android System Trace)有专门的介绍,本篇文章作为systrace系列的开头,笔者先不做任何介绍,仅仅翻译一下官网的介绍.在后续 ...

  6. RavenDB官网文档翻译系列第一

    本系列文章主要翻译自RavenDB官方文档,有些地方做了删减,有些内容整合在一起.欢迎有需要的朋友阅读.毕竟还是中文读起来更亲切吗.下面进入正题. 起航 获取RavenDB RavenDB可以通过Nu ...

  7. 【官网翻译】性能篇(四)为电池寿命做优化——使用Battery Historian分析电源使用情况

    前言 本文翻译自“为电池寿命做优化”系列文档中的其中一篇,用于介绍如何使用Battery Historian分析电源使用情况. 中国版官网原文地址为:https://developer.android ...

  8. 卸载 Cloudera Manager 5.1.x.和 相关软件【官网翻译】

    问题导读: 1.不同的安装方式,卸载方法存在什么区别?2.不同的操作系统,卸载 Cloudera Manager Server and 数据库有什么区别? 重新安装不完整如果你来到这里,因为你的安装没 ...

  9. android測试工具MonkeyRunner--google官网翻译

    近期在复习之前的笔记,在回想MonkeyRunner时看了看google官网的内容,写得不错.就翻译出来分享下.事实上google官网真是一个学习的好地方. 基础知识 MonkeyRunner工具提供 ...

随机推荐

  1. codevs 1217 借教室

    传送门 1217 借教室 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descripti ...

  2. 如何使用Instruments诊断App(Swift版):起步-b

    无论你写过许多iOS应用,还是刚刚开始你的第一个应用,毫无疑问,你都会想出一些新点子,或者想去弄明白你该怎么做,来让你的app变得更好. 除去添加新特性来优化你的应用,有一件事是所有好的开发者都回去做 ...

  3. poj 3114 Countries in War

    http://poj.org/problem?id=3114 #include <cstdio> #include <cstring> #include <queue&g ...

  4. KeilMDK4.7a下载地址/中文乱码解决/自动关联设置

    推荐地址1,速度更快(确定为4.7a版本,且含注册机):1.http://www.mcuzone.com/software/keil/MDK470.RAR 2.http://kuai.xunlei.c ...

  5. 发布WebService到IIS和调用WebService

    一:在项目上右键单击,选择发布,如图 二:可以单击重命名,自定义网站的名字,发布方式为:文件系统,目标路径为要发布的文件的位置,它需要放到IIS的目录下面的 三:打开IIS管理器,右键单击网站,添加网 ...

  6. HDOJ(HDU) 1985 Conversions(汇率转换)

    Problem Description Conversion between the metric and English measurement systems is relatively simp ...

  7. EditText输入长度动态控制,最大长度为16位,小数点后面最大为2位,输入整数只能为13位

    首先在xml 中把inputType设置为numberDecimal (包含小数点)然后在把maxLeng设置为16 package com.example.numbertest; import an ...

  8. GitHub for Mac

    GitHub for Mac 安装 1.从 mac.github.com 下载最新版本的 GitHub. 2.当你开启软件时,你可以选择用你的 GitHub 账户登录,或者新建一个账户. 3.在左侧, ...

  9. Linux操作系统以及各大发行版介绍——Linux operating system and major distribution is introduced

    什么是Linux? 也许很多人会不屑的说,Linux不就是个操作系统么.错!Linux不是一个操作系统,严格来讲,Linux只是一个操作系统中的内核.内核是什么?内核建立了计算机软件与硬件之间通讯的平 ...

  10. Git详解之一 Git起步

    起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...