监控数组

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

由于监控属性是由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. [Android P] Android P版本 新功能介绍和兼容性处理(一)

    cp from :https://blog.csdn.net/yi_master/article/details/80046696 Android P版本已经到来,首篇我们当然要先看下Android ...

  2. junit5了解一下

    要求java8及以上版本 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage https://junit.org/junit5/docs/ ...

  3. Guava BiMap AbstractBiMap

    BiMap BiMap是一个结构,他定义了一个Map结构,代表这个Map的key和value都具有唯一性, 并且可以生成相互联系的反向视图, 反向视图的数据会随着本体BiMap的变更而变更 /* * ...

  4. go语言之进阶篇主协程先退出导致子协程没来得及调用

    1.主协程先退出导致子协程没来得及调用 示例: package main import ( "fmt" "time" ) //主协程退出了,其它子协程也要跟着退 ...

  5. maskrcnn_benchmark代码分析(1)

    可以先参考:Faster-RCNN代码+理论——1/2 Object Detection and Classification using R-CNNs 使用ipdb调试 try: import ip ...

  6. iOS开发-View中frame和bounds区别

    开发中调整View的时候的经常会遇到frame和bounds,刚开始看的时候不是很清楚,不过看了一下官方文档,frame是确定视图在父视图中的位置,和本身的大小,bounds确定可以确定子视图在当前视 ...

  7. 必须记住的 30 类 CSS 选择器

    大概大家读知道`id`,`class`以及`descendant`选择器,并且整体都在使用它们,那么你正在错误拥有更大级别的灵活性的选择方式.这篇文章里面提到的大部分选择器都是在CSS3标准下的,所以 ...

  8. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter) zz

    1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple a ...

  9. 实例游戏内存修改器----CUI版本模拟

    实现说明: 目标进程内存中很可能存在多个你要搜索的值, 所以在进行第一次搜索的时候, 要把搜索到的地址记录下来,然后让用户改变要搜索的值,再在记录的地址中搜索,直到搜索到的地址惟一为止.为此写两个辅助 ...

  10. MFC中位图的显示

    分析: 首先,我们要明确一点,窗口的绘制包括两个步骤,首先:擦除窗口背景,然后再对窗口重新进行绘制:当擦除窗口背景时,程序会发生一个WM_ERASEBKGND消息,因此可以在此响应函数中完成位图的显示 ...