监控数组

单个监控属性、组合属性虽然可以解决大部分的问题,但是还有很多是他们无法做到的,比如在一组数据中进行移除添加,所以这节我们将要学习监控数组。

由于监控属性是由ko的observable构造,那么对应的数组则由observableArray构造,比如下面的代码:

 var myObservableArray = ko.observableArray();
myObservableArray.push("asd");

这里我们通过push添加了一项,ko提供的监控数组跟javascript中的自带的数组拥有很多相同的方法,所以上手起来非常快。当然监控属性还有另外一种构造方式,比如下面的代码:

         var myObservableArray = ko.observableArray([
{ a: "a", b: "b" },
{ a: "a1", b: "b1" }
]);

当然访问这个数组的话不能直接通过[]来获取,而需要像下面这样获取:

myObservableArray()[0];

最后我们通过一个例子在html中显示数组:

 <span data-bind="text: tarray"></span>
<div>
<input type="text" data-bind="value: newItem" />
<button type="button" data-bind="click: addItem">添加</button>
<button type="button" data-bind="click: removeItem">移除</button>
<button type="button" data-bind="click:sortItem">排序</button>
<button type="button" data-bind="click:reverseItem">反序</button>
</div> <script type="text/javascript">
var myObservableArray = ko.observableArray([
{ a: "a", b: "b" },
{ a: "a1", b: "b1" }
]);
myObservableArray()[0]; myObservableArray.push("asd"); var appViewModel = function () {
this.newItem = ko.observable();
this.tarray = ko.observableArray();
this.tarray.push("aaaa");
this.tarray.push("bbbb");
this.addItem = function () {
this.tarray.push(this.newItem());
this.newItem("");
};
this.removeItem = function () {
this.tarray.pop();
};
this.sortItem = function () {
this.tarray.sort();
};
this.reverseItem = function () {
this.tarray.reverse();
};
} ko.applyBindings(new appViewModel());
</script>

读者可以看到默认将会以逗号作为分隔符显示数组中的数据,然后我们在输入框中输入文字然后点添加就会在这个监控数组中添加一项,因为KO的自动同步,所以html也跟着更新了。如果我们点移除则会从监控数组中移除一项。点击排序就会对监控数组进行排序。最后一个就是反序了,就会将监控数组的数据倒过来。而且这些过程都是无刷新的。

相比javascript中的数组,ko提供的监控数组还多那么些方法,比如remove,则可以删除我们指定的项,比如myObservableArray.remove(someItem)则会删除数组中等于someItem的项,当然我们也可以传递一个函数给他,比如myObservableArray.remove(function(item) { return item.age < 18 }),则会删除满足条件的项,除了remove还有removeAll,这个方法可以传递给它一个数组,然后从监控数组中删除等于该数组中项,如果不传递任何参数则删除所有项。

但是对于一些需要跟服务器进行同步的情况下,直接删除项不是一个好的方式。因为这样我们就要在每次删除的时候要跟服务器同步。所以KO还提供了destroy和destroyAll方法,具体的用法和上面的一样,但是他们不会真正删除那些项,而是会在这些项目设置一个特定的属性_destroy,并且设置该属性的值为true。这样我们就可以在用户完成操作后遍历监控属性中_destroy为true项,与服务器同步。能够在很大的程度上提高性能。

Knockout学习之监控数组的更多相关文章

  1. Knockout学习之监控属性

    监控属性 Knockout包含以下三个核心特性: 1.监控属性和依赖跟踪 2.显式绑定 3.模板 下面我们将学习这三点中的第一点,在这之前我们先研究下MVVM模式和视图模型的概念. MVVM和视图模型 ...

  2. knockout 监控数组的缺点

    knockout的监控数组没有想象中的强大,只能监控数组元素的位置变化,或个数的增减,然后对视图对应区域进行同步. <!DOCTYPE html> <html> <hea ...

  3. knockout的监控数组实现

    knockout应该是博客园群体中使用最广的MVVM框架,但鲜有介绍其监控数组的实现.最近试图升级avalon的监控数组,决定好好研究它一番,看有没有可借鉴之处. ko.observableArray ...

  4. 监控数组与foreach绑定-Knockout.js

    html: <h2>Your seat reservations</h2> <table>    <thead>  <tr>         ...

  5. Knockout v3.4.0 中文版教程-4-通过监控数组工作

    2.通过监控数组工作 1. 监控数组 如果你想检测或者响应一个对象的改变,你用observables.如果你想检测和响应一个集合的改变,使用observableArray.这个在很多情况下都非常有用, ...

  6. knockout Observable Array(监控数组)

    Observable Array(监控数组)的作用 列表操作是经常会遇到的一个场景,使用监控数组,你可以: 保存列表对象,并且使用Ko提供的丰富的API操作列表元素(支持内建js Array的方法,以 ...

  7. knockout学习笔记目录

    关于knockout学习系列的文章已经写完,这里主要是做个总结,并且将目录罗列出来,方便查看.欢迎各位大神拍砖和讨论. 总结 kncokout是一个轻量级的UI类库,通过MVVM模式使前端的UI简单话 ...

  8. Knockout学习地址

    Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以帮助你仅使用一个清晰整洁的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的 ...

  9. 2.Knockout.Js(监控属性Observables)

    前言 1.创建一个ViewModel <script type="text/javascript"> //1.创建一个ViewModel var myViewModel ...

随机推荐

  1. [Web 前端] CSS篇之2. 清除浮动,什么时候需要清除浮动,清除浮动都有哪些方法

    cp: https://blog.csdn.net/zengyonglan/article/details/53304487 2. 清除浮动,什么时候需要清除浮动,清除浮动都有哪些方法 ? 一.什么时 ...

  2. anaconda、pip配置国内镜像

    一.anaconda配置镜像查看源:conda config --show-sources在Mac and Linux下:conda config --add channels https://mir ...

  3. C#和java之间的一些差异与共性

    C#与java之间的一些共性和差异整理 隐藏:与java中的重写几乎一致,但是需要添加new关键字让编译器知道,否则会有警告 虚方法:1.声明为virtual的方法就是虚方法,在子类中使用overri ...

  4. 100base-T

    100Base-T是一种以100Mbps速率工作的局域网(LAN)标准,它通常被称为快速以太网标准,并使用两对UTP(非屏蔽双绞线)铜质电缆. 快速以太网 : 与10BASE-T的区别在于网络速率是1 ...

  5. 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的

    最近在做数据从Excel批量导入MSSQL时,传统的是使用Insert Into Table方法,不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库. 默认批量导入数据库,需要 ...

  6. 使用ASP.NET AJAX与Bootstrap 弹窗解决方案

    我在做采购系统时,因为使用了ASP.NET AJAX的UpdatePanel的控件,可以使得页面局部刷新显示.但是使用起来问题还是很多. 下面列出了一种情况,花了将近5个小时才算解决,虽然不是很完美, ...

  7. iOS开发-类簇(Class Cluster)

    类簇(Class  Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也可以称之为类簇的公共类,每个具体类的接口有公共类的接口抽象化,并隐藏在簇的内部.这些类一般不能够直 ...

  8. 如何在Centos7上安装和使用ZFS

    导读 ZFS文件系统的英文名称为ZettabyteFileSystem,也叫动态文件系统(DynamicFileSystem),是第一个128位文件系统.最初是由Sun公司为Solaris10操作系统 ...

  9. 模拟日历计算 poj1008

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 69932   Accepted: 21524 D ...

  10. Linux 查看服务器配置

    //CPU cat /proc/cpuinfo |grep processor; //内存 free -g; //硬盘 df -h;