KnockoutJS 3.X API 第二章 数据监控(2)监控属性数组
监控属性数组
如果要对一个对象检测和响应变化,会使用监控属性。如果要对一个序列检测并监控变化,需要使用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有它自己的功能函数,而且用起来更加的方便:
- 在目标浏览器。(例如,本地JavaScript indexOf函数不能在IE 8工作或较早,但KO的indexOf可以兼容任何版本的浏览器。)
- 对于修改数组的内容,如函数push和splice,可以让所有注册的侦听器通知更改,你的用户界面会自动更新KO的依赖跟踪机制所定义的对象。
- 语法是更方便。要调用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)监控属性数组的更多相关文章
- KnockoutJS 3.X API 第二章 数据监控(1)视图模型与监控
数据监控 KO的三个内置核心功能: 监控(Observable)和依赖性跟踪(dependency tracking) 声明绑定(Declarative bindings) 模板(Templating ...
- KnockoutJS 3.X API 第一章 简介
本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...
- 【知识强化】第二章 数据的表示和运算 2.4 算术逻辑单元ALU
从本节开始我们就进入到本章的最后一节内容了,也就是我们算术逻辑单元的它的实现.这部分呢是数字电路的一些知识,所以呢,如果你没有学过数字电路的话,也不要慌张,我会从基础开始给大家补起.那么在计算机当中, ...
- 【第二章】Zabbix3.4监控SQLServer数据库和H3C交换机思科Cisco防火墙交换机教程笔记
监控SQLServer数据库 SSMS执行相关SQL SQL模板命名规则 Zabbix客户端导入模板 添加SQLServer监控图形 SQLServer服务器关联模板 监控思科Cisco防火墙交换机 ...
- MyBatis从入门到精通:第二章数据的创建与插入文件
数据库表的创建: create table sys_user ( id bigint not null auto_increment, ), user_password ), user_email ) ...
- 剑指offer—第二章算法之二分查找(旋转数组的最小值)
旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...
- ASM学习笔记--ASM 4 user guide 第二章要点翻译总结
参考:ASM 4 user guide 第一部分 core API 第二章 类 2.1.1概观 编译后的类包括: l 一个描述部分:包括修饰语(比如public或private).名字.父类.接口 ...
- KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ...
- Knockout应用开发指南 第二章:监控属性(Observables)
原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...
随机推荐
- Unity 4.x Asset Bundle 重名
在 Unity 4.5.1f3中测试发现如下问题 两个不同文件下相同名字的资源打包成AssetBundle以后加载失败,提示错误 xxxxx can't be loaded because anot ...
- 零值初始化&字符串常数作为函数模板参数
1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...
- Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...
- C#学习感悟
上周虽然没上课,课上的内容是部分同学展示大作业成果,但是对于我来说,看了一些同学辛勤劳动的成果,听了他们对C#学习的一些感悟,我受益匪浅. 在这里我想谈谈我的收获.老师给的模板是todolist,但是 ...
- 【随记】Hello World小记
今天装Python,如下: 突然想到,到现在,我已经数不清写过多少遍Hello World了. 最早是初一学VB的时候,用Label1在Form1上画一个,然后修改Caption属性为“Hello W ...
- vertica在电信的应用
本文介绍了什么 ´ 电信级大数据分析典型需求 ´ Vertica数据库特点及与其他数据库对比 ´ Vertica核心技术介绍 ´ 基于Vertica的典型分系统架构简介 电信级大数据分析典型需求 ´ ...
- VHDL生成的ngc文件被verilog的工程调用的问题
1. 问题的提出 工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into ...
- 【转载】CentOS6.5_X64下安装配置MongoDB数据库
[转载]CentOS6.5_X64下安装配置MongoDB数据库 2014-05-16 10:07:09| 分类: 默认分类|举报|字号 订阅 下载LOFTER客户端 本文转载自zhm&l ...
- MySql与Oracle的区别总结
在平时工作中使用这两个数据库的时候要多一些,这两数据库的使用方面存在的一些各自不同的地方,许多面试官也会问这两个的区别.所以,凭着自己的一些经验个感触,来说说这二者的区别. 使用的群众:MySql中小 ...
- 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)
解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...