监控数组

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

由于监控属性是由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. 中文代码之Spring Boot集成H2内存数据库

    续前文: 中文代码之Spring Boot添加基本日志, 源码库地址相同. 鉴于此项目中的数据总量不大(即使万条词条也在1MB之内), 当前选择轻量级而且配置简单易于部署的H2内存数据库比较合理. 此 ...

  2. PHP读写INI文件

    读INI文件 public function readini($name) { if (file_exists(SEM_PATH.'init/'.$name)){ $data = parse_ini_ ...

  3. C# 图片识别(支持21种语言) (转)

    图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号. 图片识别的用途:很多人用它去破解网站的验证码,用于达到自动刷票或者是批量 ...

  4. 升级项目到Vs2010,编译时出现:MSB6006: “LC.exe”已退出,解决方法

    最近装了Vs2010 准备把一些项目,升级到.Net 4.0 在编译时,总是出现 MSB6006: “LC.exe”已退出 的错误.很是郁闷.刚开始以为是第三方控件的,去掉了,也不行.后来在网上找了一 ...

  5. [leetcode]Clone Graph @ Python

    原题地址:https://oj.leetcode.com/problems/clone-graph/ 题意:实现对一个图的深拷贝. 解题思路:由于遍历一个图有两种方式:bfs和dfs.所以深拷贝一个图 ...

  6. 使用numba加速python程序

    前面说过使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即 ...

  7. IntelliJ IDEA windows与mac下常用快捷键

    摘自: http://www.th7.cn/Program/java/201604/817219.shtml 1.找文件找代码找引用 shif双击在项目的所有目录查找 ctrl+f(mac下:comm ...

  8. python2.7 调用 .net的webservice asmx

    首先安装pip install suds 或下载:https://pypi.org/project/suds-jurko/0.6/#files 这个是最新版本 由于不支持python3.6, 所以只能 ...

  9. 在浏览器中直接调用webservice的正确写法

    此文章针对webwork+spring+hibernate的工程,对于其他框架应该一样适用,首先在wsdd文件中找到所需webservice的名称,例如以下写法: <service name=& ...

  10. Spark参数设置的方式

    可以通过以下几种方式设置: 1)bin/spark-submit 可以直接读取conf/spark-defaults.conf文件 每一行为一个key和valuespark.master        ...