监控属性数组

如果要对一个对象检测和响应变化,会使用监控属性。如果要对一个序列检测并监控变化,需要使用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. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  2. 百度音乐api

    百度音乐全接口 会利用使用接口找歌简单又快捷 http://tingapi.ting.baidu.com/v1/restserver/ting 获取方式:GET 参数:format=json或xml& ...

  3. Create Oracle Enterprise Manager repository data after restore a database from another server

    1. Set password for SYS in password file: orapwd file=$ORACLE_HOME/dbs/orapw<ORACLE_SID> 2. Dr ...

  4. 使用netty实现的tcp通讯中如何实现同步返回

    在netty实现的tcp通讯中,一切都是异步操作,这提高了系统性能,但是,有时候client需要同步等待消息返回,如何实现呢?笔者已经实现,在此总结下重点要素 实现要点: 1.消息结构设计 消息头中需 ...

  5. xxxx年度员工岗位技能调查表

    昨天应公司要求设计了一张 <员工岗位技能调查表>,写微博有2个目的:第一是供大家参考,第二是记录下从事质量管理工作走过的点点滴滴.这是我第一次写工作方面的博客,之后会坚持写下去的. --- ...

  6. linux延时关机

    04.shutdown +2 "The machine will shutdown" # 2min 后关机,并通知在线者 05.shutdown -h now 立刻关机,其中now ...

  7. SELECT TOP 100 PERCENT 不按后面的order by 排序

    项目中,由于需要把3个状态的任务合并显示,并且按照任务由近及远的顺序排序,类似于下面的语句 order by taskid desc )m union all order by taskid desc ...

  8. 原生Ajax封装随笔

    XMLHttpRequest 对象用于和服务器交换数据.我们使用 XMLHttpRequest 对象的 open() 和 send() 方法: open(method,url,async) metho ...

  9. Asp.net web form url route使用总结

    asp.net web form 使用URL路由 注不是mvc中的路由 一.前台控件使用路由,通过表达式生成url地址,注意给路由参数赋值,防止使用了其他路由表达式值方式1:<asp:Hyper ...

  10. hadoop 笔记(hbase)

    hbase 基础: hbase是基于列的数据,其数据模式如下: 1.安装 1.1)hbase安装分为单机.伪分布式.分布式,单机下安装不依赖于hadoop:因为不需要分布式文件系统支持: 1.2)安装 ...