监控属性数组

如果要对一个对象检测和响应变化,会使用监控属性。如果要对一个序列检测并监控变化,需要使用observableArray(监控属性数组)。这在你显示或编辑多个值,需要用户界面的部分反复出现和消失的项目并且具有添加和删除操作的情况下使用observableArray。

例如声明并赋值:

var myObservableArray = ko.observableArray(); // Initially an empty array
myObservableArray.push('Some value'); // Adds the value and notifies observers

解如何绑定observableArray到用户界面,让用户可以修改它,可以参考如下例子:

视图代码:

<form data-bind="submit: addItem">
New item:
<input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' />
<button type="submit" data-bind="enable: itemToAdd().length > 0">Add</button>
<p>Your items:</p>
<select multiple="multiple" width="50" data-bind="options: items"> </select>
</form>

视图模型代码:

var SimpleListModel = function(items) {
this.items = ko.observableArray(items);
this.itemToAdd = ko.observable("");
this.addItem = function() {
if (this.itemToAdd() != "") {
this.items.push(this.itemToAdd()); // Adds the item. Writing to the "items" observableArray causes any associated UI to update.
this.itemToAdd(""); // Clears the text box, because it's bound to the "itemToAdd" observable
}
}.bind(this); // Ensure that "this" is always this view model
}; ko.applyBindings(new SimpleListModel(["Alpha", "Beta", "Gamma"]));

初始化observableArray

如果你希望observableArray在程序开始的时候就具有一定的数据,可以通过如下方式进行observableArray的初始化:

// This observable array initially contains three objects
var anotherObservableArray = ko.observableArray([
{ name: "Bungle", type: "Bear" },
{ name: "George", type: "Hippo" },
{ name: "Zippy", type: "Unknown" }
]);

从observableArray读取信息

在后台,一个observableArray实际上是一个监控属性,它的值是一个数组。所以,你可以通过调用获得底层的JavaScript数组不带参数的函数,然后,你可以阅读数组信息。例如:

alert('The length of the array is ' + myObservableArray().length);
alert('The first element is ' + myObservableArray()[0]);

从技术上讲,你可以使用任何的本地JavaScript数组函数来读取observableArray的内容,但通常有一个更好的选择。KO的observableArray有它自己的功能函数,而且用起来更加的方便:

  1. 在目标浏览器。(例如,本地JavaScript indexOf函数不能在IE 8工作或较早,但KO的indexOf可以兼容任何版本的浏览器。)
  2. 对于修改数组的内容,如函数push和splice,可以让所有注册的侦听器通知更改,你的用户界面会自动更新KO的依赖跟踪机制所定义的对象。
  3. 语法是更方便。要调用KO的push方式,只需要写myObservableArray.push(...)。这比调用底层Javascript写方法myObservableArray().push(...)更加方便

索引

该indexOf函数返回等于你参数的第一个数组元素的索引。例如,myObservableArray.indexOf('Blah')将返回第一个数组条目等于从零开始的索引Blah,如果没有匹配值被发现则返回-1

数组片段

observableArray的slice函数与本地JavaScript的slice函数等价(即,它从已有的数组中返回选定的元素)。调用myObservableArray.slice(...)与myObservableArray().slice(...)等效于。

observableArray数组操作

(移除,增加,插入,移除单一元素,反转顺序,排序,移除部分元素)

所有这些功能都等同于运行底层JavaScript数组函数:

  • push( value ) - 增加了一个新的项目,在数组的末尾。
  • pop() - 移除数组的最后一个值,并返回它。
  • unshift( value ) - 在数组开头插入一个新项目。
  • shift() - 移除数组的第一个值并返回。
  • reverse()-反转数组的顺序,并返回observableArray。
  • sort()-排序数组内容并返回observableArray。
    • 默认的排序是按字母顺序,但你可以选择传递一个参数来控制阵列如何进行排序。你的函数应该接受来自数组的任意两个对象,如果第一个参数为较小返回一个负值,正值是第二较小,或为零它们视为相等。例如,排序按姓氏'人'对象的数组,你可以写myObservableArray.sort(function (left, right) { return left.lastName == right.lastName ? 0 : (left.lastName < right.lastName ? -1 : 1) })
  • splice()-删除,并返回从一个给定的索引起始元件的给定数目。例如,myObservableArray.splice(1, 3)将删除索引位置1(即第二,第三和第四个元素)开始三个元素,并返回它们作为一个数组。

有关这些详细信息observableArray的函数,可以参考等价文档标准的JavaScript数组函数

删除和删除全部

observableArray 的补充方法:

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

销毁destroyAll(注: Ruby on Rails的开发人员需要了解)

该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对象,该框架可以自动将其转换为一个ActiveRecord对象,然后将其保存到数据库中。它知道它的对象都已经在你的数据库,并发出正确的INSERT或UPDATE语句。告诉框架删除一条记录,你只是将_destroy标记设置为true。

请注意,当KO呈现一个foreach具有约束性,它会自动隐藏标记用任何元素的_destroy。所以,你可以有某种"删除"按钮调用该destroy(someItem)方法在数组上,这将立即引起指定的项目,从UI消失。后来,当您提交Rails的JSON对象,该项目也将被从数据库中删除。

延缓和/或抑制更改通知

通常情况下,observableArray只要它的改变会立即通知其用户。但如果observableArray反复更改高昂的更新数据传输频率,你可以通过限制或拖延更改通知,获得更好的性能。这是通过使用rateLimit进行限制:

// Ensure it notifies about changes no more than once per 50-millisecond period
myViewModel.myObservableArray.extend({ rateLimit: 50 });

KnockoutJS 3.X API 第二章 数据监控(2)监控属性数组的更多相关文章

  1. KnockoutJS 3.X API 第二章 数据监控(1)视图模型与监控

    数据监控 KO的三个内置核心功能: 监控(Observable)和依赖性跟踪(dependency tracking) 声明绑定(Declarative bindings) 模板(Templating ...

  2. KnockoutJS 3.X API 第一章 简介

    本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...

  3. 【知识强化】第二章 数据的表示和运算 2.4 算术逻辑单元ALU

    从本节开始我们就进入到本章的最后一节内容了,也就是我们算术逻辑单元的它的实现.这部分呢是数字电路的一些知识,所以呢,如果你没有学过数字电路的话,也不要慌张,我会从基础开始给大家补起.那么在计算机当中, ...

  4. 【第二章】Zabbix3.4监控SQLServer数据库和H3C交换机思科Cisco防火墙交换机教程笔记

    监控SQLServer数据库 SSMS执行相关SQL SQL模板命名规则 Zabbix客户端导入模板 添加SQLServer监控图形 SQLServer服务器关联模板 监控思科Cisco防火墙交换机 ...

  5. MyBatis从入门到精通:第二章数据的创建与插入文件

    数据库表的创建: create table sys_user ( id bigint not null auto_increment, ), user_password ), user_email ) ...

  6. 剑指offer—第二章算法之二分查找(旋转数组的最小值)

    旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...

  7. ASM学习笔记--ASM 4 user guide 第二章要点翻译总结

    参考:ASM 4 user guide 第一部分 core API 第二章  类 2.1.1概观 编译后的类包括: l  一个描述部分:包括修饰语(比如public或private).名字.父类.接口 ...

  8. KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪

    KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ...

  9. Knockout应用开发指南 第二章:监控属性(Observables)

    原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...

随机推荐

  1. memset 究竟在做什么?

    我要 一字节一字节 地 memory set

  2. 学习django之正则表达式的语法

    正则表达式 正则表达式的常用语法: 1)单个字符: .          任意的一个字符 a|b        字符a或字符b [afg]      a或者f或者g的一个字符 [0-4]      0 ...

  3. strncpy和memcpy的区别

    今天不小心在该用memcpy的时候,用了strncpy使自己吃了亏,所以写出这个博文. memcpy就是纯字节拷贝,而strncpy就不同了,字符串是以'\0'结尾的.如果一个字符buffer长度为6 ...

  4. 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决

    当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合A ...

  5. php图片处理类库 Image

    image 下载地址 https://github.com/Intervention/image.git 下载之后解压 执行composer update 生成 autoload.php文件   该类 ...

  6. unity发布安卓 手指控制物体缩放和旋转

    直接帮到物体的身上就可以了 using UnityEngine; using System.Collections;using System.IO;public class hehe : MonoBe ...

  7. TypeScript之基本数据类型

    前言 最近项目很急,所以没有什么时间回答关于Xamarin.Android方面的问题,也有一段时间没有更新.主要是手头很缺人,如果有谁有兴趣加入我们的话,可以私聊我,这样我就能继续造福社区了,同时还有 ...

  8. Oracle中的Temporary tablespace的作用

    临时表空间主要用途是在数据库进行排序运算[如创建索引.order by及group by.distinct.union/intersect/minus/.sort-merge及join.analyze ...

  9. Hdoop日记Day10---RPC机制

    一.RPC(Remote Procedure Call)简介 RPC 是远程过程调用(Remote Procedure Call),即远程调用其他虚拟机中运行的javaobject.RPC 是一种客户 ...

  10. 作业二--注册GitHub的过程

    第一步:打开GitHub官网https://github.com/,在界面中输入账号名称.邮箱.密码,然后点击注册按钮. 第二步:注册完成后,选择Free免费账号完成初始设置. 第三步:验证邮箱,打开 ...