2.通过监控数组工作

1. 监控数组

如果你想检测或者响应一个对象的改变,你用observables。如果你想检测和响应一个集合的改变,使用observableArray。这个在很多情况下都非常有用,比如当你在显示或者编辑多个值而且需要重复的UI部分通过添加和移除来显示/隐藏项。

例子:

var myObservableArray = ko.observableArray();    // 初始化空数组
myObservableArray.push('Some value'); // 添加值并通知监控

为了看怎样绑定observableArray到一个UI界面,同时我们可以修改它,看简单列表的例子。

2. 关键点:一个监控数组对象跟踪数组里面有哪些对象,而不是这些对象的状态

简单地把一个对象放进一个observableArray并不会让所有对象自身的属性被监控。当然,如果你想,你可以让这些属性被监控,一个observableArray仅仅跟踪它存有哪些对象和在添加和移除对象的时候通知监听器。

3. 尝鲜observableArray

如果你希望你的observable数组不是开始为空,而是包含一些初始项,将这些项作为一个数组传递给构造函数。 例如,

// 监控数组默认包含三个对象
var anotherObservableArray = ko.observableArray([
{ name: "Bungle", type: "Bear" },
{ name: "George", type: "Hippo" },
{ name: "Zippy", type: "Unknown" }
]);

4. 读取observableArray的信息

在实现上,observableArray实际上是一个observable对象,其值是一个数组(如下所述,observableArray还添加了一些附加功能)。所以,你可以通过调用observableArray作为无参函数来获取底层的JavaScript数组,就像一个监控对象。然后,您可以从该底层数组读取信息。 例如,

alert('数组长度为 ' + myObservableArray().length);
alert('第一个元素是' + myObservableArray()[0]);

技术上来讲,你可以使用任何原生JavaScript数组函数来操作这个底层数组,但有一个更好的选择。 KO的observableArray具有自己的等价函数,它们更有用,因为:

  1. 它们适用于所有的浏览器。 (例如,原生JavaScript 的indexOf函数在IE 8或更早版本上不工作,但KO的indexOf在任何地方都可以使用。)
  2. 对于修改数组内容的函数(例如pushsplice),KO的方法会自动触发依赖关系跟踪机制,以便向所有已注册的侦听器通知更改,并且您的UI会自动更新。
  3. 语法更方便。 要调用KO的push方法,只需写myObservableArray.push(...)。 这比通过编写myObservableArray().push(...)调用原生javascript数组的push方法稍微好一点。

此节剩下的内容是描述observableArray读写数组信息的功能。

1. indexOf

indexOf函数返回等于您的参数的第一个数组项的索引。 例如,myObservableArray.indexOf('Blah')将返回等于Blah的第一个数组实体从零开始的索引,如果没有找到匹配的值,则返回-1。

2. slice

slice函数是observableArray等价于原生 JavaScript 的slice函数(即,它会返回从你给定的开始位置和结束位置之间的数组实体,不包含结束位置的数组实体)。 调用myObservableArray.slice(...)等价于在原生数组(myObservableArray().slice(...))上调用相同的方法。

5. 操作一个监控数组

observableArray暴露了一组熟悉的函数,用于修改数组的内容和通知侦听器。

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

所有这些函数都等价于在本地运行的JavaScript数组函数,然后通知监听器有关更改:

  • push( value ) — 在数组末尾添加一个新的元素。
  • pop() — 从数组里面移除最后一个元素并返回它。
  • unshift( value ) — 在数组头部添加一个新的元素。
  • shift() — 从数组里面移除第一个元素并返回它。
  • reverse() — 颠倒数组的顺序,并返回observableArray(而不是底层数组)。
  • sort() — 排序数组内容并返回observableArray
    • 默认排序是字母顺序,但您可以选择传递一个函数来控制数组的排序方式。您的函数应该接受数组中的任意两个对象,如果第一个参数较小,则返回一个负值,如果第二个参数较小,则返回一个正值,如果相等则返回0。例如,要按姓氏对person对象数组排序,可以这样写:
myObservableArray.sort(function (left, right) { return left.lastName == right.lastName ? 0 : (left.lastName < right.lastName ? -1 : 1) })
  • splice() — 从给定的索引开始删除并返回给定数量的元素。 例如,myObservableArray.splice(1,3)删除从索引位置1开始的三个元素(即第2,第3和第4个元素),并将它们作为数组返回。

有关这些observableArray函数的更多详细信息,请参阅标准JavaScript数组函数的等价文档。

6. 移除和移除全部

observableArray 添加了一些原生javascript没有的特别有用的方法:

  • remove( someItem ) — 删除所有等于someItem的值,并将它们作为数组返回。
  • remove( function (item) { return item.age < 18; } ) — 删除所有age属性小于18的值,并将它们作为数组返回。
  • removeAll( ['Chad', 132, undefined] ) — 删除所有等于'Chad'123undefined的值 ,并将它们作为数组返回。
  • removeAll() — 删除所有值并将其作为数组返回。

7. 破坏和破坏所有

destroydestroyAll函数主要是为了方便使用Ruby on Rails的开发人员:

  • destroy( someItem)—查找数组中等于someItem的任何对象,并给它们一个名为_destroy的特殊属性,赋值为true
  • destroy( function (someItem) { return someItem.age < 18; } ) — 查找数组中age属性小于18的任何对象,并给这些对象一个名为_destroy的特殊属性,赋值为true
  • destroyAll( ['Chad', 132, undefined] ) — 查找数组中等于'Chad'123undefined的任何对象,并给它们一个名为_destroy的特殊属性,赋值为true
  • destroyAll() —为数组中的所有对象提供一个名为_destroy的特殊属性,赋值为true

那么,_destroy是什么?对其感兴趣的仅仅只有Rails开发人员。 Rails中的约定是,当你将一个JSON对象图传递给一个action时,框架可以自动将其转换为ActiveRecord对象图,然后将其保存到数据库中。 它知道哪些对象已经在您的数据库中存在,并发出正确的INSERT或UPDATE语句。 要告诉框架删除一个记录,你只需将它标记为_destroy设置为true

注意,当KO渲染foreach绑定时,它会自动隐藏任何标记为_destroy等于true的对象。所以,你可以有一个“删除”按钮,调用数组上的destroy(someItem)方法,这可以使指定的项从界面UI中立即消失。 之后,当您将JSON对象图提交到Rails时,该项也将从数据库中删除(而其他数组项可以像往常一样插入或更新)。

8. 延迟或阻止更改通知

通常情况下,一个监控数组对象只要发生改变就会立即通知订阅者。但是一个监控数组对象频繁重复改变或触发一直更新,代价会很大,通过限制或延迟监控到的更改通知,可以获得更好的性能。可以使用频率限制扩展器来完成,如下:

// 确保每50毫秒内通知改变不超过一次
myViewModel.myObservableArray.extend({ rateLimit: 50 });

Knockout v3.4.0 中文版教程-4-通过监控数组工作的更多相关文章

  1. Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性

    4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...

  2. Knockout v3.4.0 中文版教程-5-计算监控-使用计算监控

    3. 计算监控 1.使用计算监控 如果你有一个监控的属性firstName和另一个lastName,但你想显示全名怎么办? 这就是引入计算监控的原因-这是依赖于一个或多个其他的observables函 ...

  3. Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控

    2.可写的计算监控 初学者可能想要跳过本节 - 可写的计算监控是相当高级的部分,在大多数情况下不是必需的. 通常,计算监控是一个通过其他监控值计算出的值,因此是只读的. 令人惊讶的是,可以使计算监控值 ...

  4. Knockout v3.4.0 中文版教程-9-计算监控-API参考

    5.参考 下面的内容描述了如何构建和使用计算监控. 1. 构建一个计算监控 可以用如下的形式构建一个计算监控: ko.computed( evaluator [, targetObject, opti ...

  5. Knockout v3.4.0 中文版教程-7-计算监控-依赖跟踪如何工作

    3.依赖跟踪如何工作 初学者不需要知道这一点,但更高级的开发人员将想知道为我们怎么实现KO自动跟踪依赖性和自动更新UI的正确部分... 它其实相当简单优雅,跟踪算法如下: 当你定义一个计算监控,KO立 ...

  6. Knockout v3.4.0 中文版教程-16-控制流-foreach绑定

    2. 控制流 1. foreach绑定 目的 foreach绑定会遍历一个数组,为每个数组项生成重复的元素标记结构并做关联.这在渲染列表或表格的时候特别有用. 假设你的数组是一个监控数组,之后无论你进 ...

  7. Knockout v3.4.0 中文版教程-1-入门和安装

    英文原版教程:http://knockoutjs.com/documentation/introduction.html 注:此教程根据英文原版翻译,仅作练习,如有不足或错误,请指正 说明: 对原文中 ...

  8. Knockout v3.4.0 中文版教程-14-控制文本内容和外观-style绑定

    5. style绑定 目的 style绑定用来给关联的DOM元素添加或移除一个或多个样式值.在如下情况很有用,比如,当某些值为负时,高亮显示,或者设置容器元素的宽度来匹配数值的改变. (注意:如果你不 ...

  9. Knockout v3.4.0 中文版教程-13-控制文本内容和外观-css绑定

    4. css绑定 目的 css绑定可以给关联的DOM元素添加或移除一个或多个CSS类.该绑定很有用,比如,当一些值为负数时高亮这些值为红色. (注意:如果你不想使用一个CSS类选择器来附加样式而想直接 ...

随机推荐

  1. [在读]JavaScript异步编程:设计快速响应的网络应用

    很棒的一本,就如书名所示,主要讲js异步的一些东西,比如定时器.Jquery的promise和deffered,node...看了一小半.推荐哦~~

  2. VMware下OSSIM 4.1.0的下载、安装和初步使用(图文详解)

    不多说,直接上干货! 为什么,我写了一篇OSSIM 5.2.0的,还要再来写OSSIM 4.1.0呢,是因为,OSSIM 5.2.0所需内存较大,8G甚至16G,但是,肯定性能和里面集成组件越高级.也 ...

  3. iis日志存放位置 及 查看方法

    IIS:控制面板--管理工具--internet信息服务 网站的IIS日志是在空间里面看的.要登陆到空间里面的一个IIS日志里面看.IIS日志一般都很大的.看会有点.. 一.应用程序日志.安全日志.系 ...

  4. Sql Server 排序规则字符集的冲突问题

    可通过如下sql 进行修改: 如果整个DB都不一致: Alter database Expense_Portal collate Chinese_PRC_CI_AS 某张Table的栏位不一致: ) ...

  5. 2018百度之星初赛(A)2 度度熊学队列

    思路: 记录一下c++ stl中的双向链表list的各种用法. https://blog.csdn.net/fanyun_01/article/details/56881515 实现: #includ ...

  6. git的基本使用命令操作

    Linux操作命令行:    mkdir - 创建文件夹,    cd - 切换文件路径    pwd - 显示文件路径    ls -ah - 可以查看隐藏的文件夹名(.git)    cat 文件 ...

  7. 【数据库-Azure SQL Database】如何创建事务复制将本地数据同步到 SQL Azure

    Azure SQL DB 可以被配置成为 SQL Server 事务复制的一个订阅者( subscriber ). 主要应用场景有两种: 将您的数据迁移到 Azure SQL DB, 并且没有宕机时间 ...

  8. SQL问题:未启用当前数据库的 SQL Server Service Broker

    数据库分离后,附加回到数据库,然后在程序中打开调用数据库的页面,出现如下问题:“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数 ...

  9. ubuntu 14.04 安装mysql,并配置远程连接和中文乱码

    1. 安装MySQL的jar root@computer-PowerEdge-T30:~# sudo apt-get install mysql-server mysql-client在本次安装中,根 ...

  10. SAP产品的Field Extensibility

    SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...