Knockout v3.4.0 中文版教程-4-通过监控数组工作
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具有自己的等价函数,它们更有用,因为:
- 它们适用于所有的浏览器。 (例如,原生JavaScript 的
indexOf
函数在IE 8或更早版本上不工作,但KO的indexOf在任何地方都可以使用。) - 对于修改数组内容的函数(例如
push
和splice
),KO的方法会自动触发依赖关系跟踪机制,以便向所有已注册的侦听器通知更改,并且您的UI会自动更新。 - 语法更方便。 要调用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
对象数组排序,可以这样写:
- 默认排序是字母顺序,但您可以选择传递一个函数来控制数组的排序方式。您的函数应该接受数组中的任意两个对象,如果第一个参数较小,则返回一个负值,如果第二个参数较小,则返回一个正值,如果相等则返回0。例如,要按姓氏对
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'
,123
或undefined
的值 ,并将它们作为数组返回。 - removeAll() — 删除所有值并将其作为数组返回。
7. 破坏和破坏所有
destroy
和destroyAll
函数主要是为了方便使用Ruby on Rails的开发人员:
- destroy( someItem)—查找数组中等于
someItem
的任何对象,并给它们一个名为_destroy
的特殊属性,赋值为true
。 - destroy( function (someItem) { return someItem.age < 18; } ) — 查找数组中
age
属性小于18的任何对象,并给这些对象一个名为_destroy
的特殊属性,赋值为true
。 - destroyAll( ['Chad', 132, undefined] ) — 查找数组中等于
'Chad'
,123
或undefined
的任何对象,并给它们一个名为_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-通过监控数组工作的更多相关文章
- Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性
4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...
- Knockout v3.4.0 中文版教程-5-计算监控-使用计算监控
3. 计算监控 1.使用计算监控 如果你有一个监控的属性firstName和另一个lastName,但你想显示全名怎么办? 这就是引入计算监控的原因-这是依赖于一个或多个其他的observables函 ...
- Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控
2.可写的计算监控 初学者可能想要跳过本节 - 可写的计算监控是相当高级的部分,在大多数情况下不是必需的. 通常,计算监控是一个通过其他监控值计算出的值,因此是只读的. 令人惊讶的是,可以使计算监控值 ...
- Knockout v3.4.0 中文版教程-9-计算监控-API参考
5.参考 下面的内容描述了如何构建和使用计算监控. 1. 构建一个计算监控 可以用如下的形式构建一个计算监控: ko.computed( evaluator [, targetObject, opti ...
- Knockout v3.4.0 中文版教程-7-计算监控-依赖跟踪如何工作
3.依赖跟踪如何工作 初学者不需要知道这一点,但更高级的开发人员将想知道为我们怎么实现KO自动跟踪依赖性和自动更新UI的正确部分... 它其实相当简单优雅,跟踪算法如下: 当你定义一个计算监控,KO立 ...
- Knockout v3.4.0 中文版教程-16-控制流-foreach绑定
2. 控制流 1. foreach绑定 目的 foreach绑定会遍历一个数组,为每个数组项生成重复的元素标记结构并做关联.这在渲染列表或表格的时候特别有用. 假设你的数组是一个监控数组,之后无论你进 ...
- Knockout v3.4.0 中文版教程-1-入门和安装
英文原版教程:http://knockoutjs.com/documentation/introduction.html 注:此教程根据英文原版翻译,仅作练习,如有不足或错误,请指正 说明: 对原文中 ...
- Knockout v3.4.0 中文版教程-14-控制文本内容和外观-style绑定
5. style绑定 目的 style绑定用来给关联的DOM元素添加或移除一个或多个样式值.在如下情况很有用,比如,当某些值为负时,高亮显示,或者设置容器元素的宽度来匹配数值的改变. (注意:如果你不 ...
- Knockout v3.4.0 中文版教程-13-控制文本内容和外观-css绑定
4. css绑定 目的 css绑定可以给关联的DOM元素添加或移除一个或多个CSS类.该绑定很有用,比如,当一些值为负数时高亮这些值为红色. (注意:如果你不想使用一个CSS类选择器来附加样式而想直接 ...
随机推荐
- 18002 Z-Scan 模拟题
18002 Z-Scan 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description Z-Scan is a method ...
- 如何查找Oracle某列值相同的字段
相关的sql语句如下 select xm_guidfrom T_NZYDKgroup by xm_guidhaving count (*)>1
- 常用验证函数isset()/empty()/is_numeric()函数
1) isset()用来检查变量是否设置,若变量存在且值不为NULL时为TRUE: 检查多个变量时变量要全部存在且值不为NULL时为TRUE: 若用函数unset()释放后再用isset()检测时为F ...
- [windows]解决Win7访问Windows 2003、XP共享慢的问题
解决方法: 1. 修改网卡配置打开本地连接属性,点击"配置"在"高级"选项卡中,将"大型发送分载(IPv4)"的值设置成"禁用&q ...
- LINUX 安装JDK (rpm格式和tar.gz格式)
谷歌博客地址:http://tsaiquinn.blogspot.com/2014/10/linux-jdk-rpmtargz.html JDK rpm方式: 我使用的是SecureCRT,先下载了然 ...
- COGS 1578. 次小生成树初级练习题
☆ 输入文件:mst2.in 输出文件:mst2.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式] 第一行包含两个整数N 和M,表 ...
- 编译驱动链接到了Kernel32库问题
最近开始学习驱动编程,根据网上的配置方法配置了驱动开发环境,用了一个简单的例子测试发现驱动居然链接到了kerner32库里面去了如图 : 显然是把Kernel.lib添加到了附加依赖库 如图 : 去掉 ...
- 怎样将英文版的Eclipse转为中文版的?
=====>1.打开eclipse储存文件夹 =====>2.在eclipse文件中找到dropins文件 =====>3.把已经下载好的eclipse汉化包复制到dropins中 ...
- Objective-C相关Category的收集(更新)
Categories是给你得不到源码的classes增加功能的一种方法.这个页面收集一些相关的Category,并且持续更新,你可以订阅关注.作者是Fille ?str?m,是@ IMGNRY的联合创 ...
- iOS的设计备忘录/资源集合(新手快速开发)
iOS的设计备忘录 随着iOS7更新,风格走上扁平化,大部分iOS设计师及程序员都需要对自己的软件做相关调整,尺寸.Icon.UI等等,我在这里总结一下相关资料,以及提供一些关于iOS7设计素材. 一 ...