监控属性数组

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

例如声明并赋值:

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

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

视图代码:

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

视图模型代码:

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

初始化observableArray

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

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

从observableArray读取信息

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

  1. alert('The length of the array is ' + myObservableArray().length);
  2. 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进行限制:

  1. // Ensure it notifies about changes no more than once per 50-millisecond period
  2. 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. 我与solr(二)--导入mysql数据库

    关于solr的搭建详见上一篇的随笔. 步骤1: 在webapps中solrhome下新建一个文件夹名字叫做mynode(名字不固定,可以随便取,但是这个名字在后面的配置中会有所关联.)然后在mynod ...

  2. [UCSD白板题] Pairwise Distinct Summands

    Problem Introduction This is an example of a problem where a subproblem of the corresponding greedy ...

  3. 手机移动端alert替换方案

    //alert ;(function () { var AlertBox = function (options){ this.defaults = { title:"", cal ...

  4. JavaSE自学笔记

    ch03 [Thu Aug 18 2016 11:22:26 GMT+0800] 对象变量与对象之间是指代关系,对象变量并不能完全说明有无对象可用.这种指代关系是通过赋值运算建立起来的.对象变量保存的 ...

  5. uva 11357 Matches

    // uva 11357 Matches // // 题目大意: // // 给你n个火柴,用这n个火柴能表示的非负数有多少个,不能含有前导零 // // 解题思路: // // f[i] 表示正好用 ...

  6. jdk1.6 webService 客户端代码生成和测试

    参数:测试webService的地址:http://10.113.11.1:9090/enocpService/buildingEngService?wsdl 1,eclipse中新建一个项目, 2, ...

  7. Eclipse配置tomcat后,启动tomcat,访问tomcat报404错误

    当你在Eclipse中新建一个工程,配置好tomcat,然后测试tomcat是否配置成功的时候,报404错误异常. 解决方法: 1,把工程文件删除,重新建立一个新的工程, 2,新建一个工程. 3,Ne ...

  8. selenium support

      org.openqa.selenium.support.ui.Select select = new org.openqa.selenium.support.ui.Select(driver.fi ...

  9. testng xml中按顺序执行java类

    如红字部份,将安顺序执行4个类 <?xml version="1.0" encoding="UTF-8"?><suite name=" ...

  10. IOS开发——使用数据库

    IOS开发——使用FMDB数据库 简介 需求作用: 如果需要保存大量的结构较为复杂的数据的时候,使用数据库,例如交规考试项目 1.数据库的基本介绍 数据库(DB)是一种数据模型组织起来并存放存储管理的 ...