监控数组

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

由于监控属性是由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. 【Codeforces】【#295】【Div.1】

    嘛,一直以来蒟蒻都没怎么打过CF……现在还是蓝名狗……今天跟着zyf打了一场virtual,果断一题滚粗

  2. Verilog 加法器和减法器(6)

    为了减小行波进位加法器中进位传播延迟的影响,可以尝试在每一级中快速计算进位,如果能在较短时间完成计算,则可以提高加法器性能. 我们可以进行如下的推导: 设 gi=xi&yi, pi = xi ...

  3. Learning to rank相关的pointwise,pairwise,listwise

    论文分享--- >Learning to Rank: From Pairwise Approach to Listwise Approach 学习排序 Learning to Rank 小结 [ ...

  4. 构建-14 Gradle使用技巧

    官方文档 Gradle 提示与诀窍 [Gradle tips and recipes] Gradle 和 Android Plugin for Gradle 提供了一种灵活的方式[a flexible ...

  5. 构建配置 ProGuard Shrink 混淆和压缩

    官方文档 压缩代码和资源 要尽可能减小 APK 文件,您应该启用压缩来移除 release build 中未使用的代码和资源.此页面介绍如何执行该操作,以及如何指定要在构建时保留或舍弃的代码和资源. ...

  6. AOP AspectJ 字节码 示例 Hugo MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Mysql 高可用方案

    1 mysql分布式数据库,如 mycat https://www.cnblogs.com/zzsdream/articles/6650690.html 2 读写分离,mysql主从复制+mysql ...

  8. Swift语言从天而降,是否能掀起新一轮的科技革命?

    Swift语言从天而降,是否能掀起新一轮的科技革命? Swift语言诞生到如今,才短短一个月多,Swift居然挤进TIOBE排行榜的第16位,相信这发展的速度绝不是不论什么一个语言可与之相提并论,那S ...

  9. Laravel Composer 脚本

    composer update --no-scripts 执行静态文件 composer dump-autoload 文件映射

  10. Linq-插入insert

    1.简单形式 说明:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提交到数据库. NorthwindDataContext db = n ...