foreach绑定

foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中

假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM-插入或去除相关项目或重新排序现有的DOM元素,不影响任何其他的DOM元素。

当然,也可以配合其他控制流一起适用,例如if和with。

示例1:遍历监控属性数组

本例适用foreach绑定,在一个table标签中循环显示监控属性数组的内容

First nameLast name

ko.applyBindings({

people: [

{ firstName: 'Bert', lastName: 'Bertington' },

{ firstName: 'Charles', lastName: 'Charlesforth' },

{ firstName: 'Denise', lastName: 'Dentiste' }

]

});

示例2:添加或删除项目

UI源码:

People

  • Name at position :

    Remove

Add

视图模型源码:

function AppViewModel() {

var self = this;

self.people = ko.observableArray([

{ name: 'Bert' },

{ name: 'Charles' },

{ name: 'Denise' }

]);

self.addPerson = function() {

self.people.push({ name: "New at " + new Date() });

};

self.removePerson = function() {

self.people.remove(this);

}

}

ko.applyBindings(new AppViewModel());

备注1:使用$data

如前两个示例中,foreach后面所跟的是要循环的监控属性数组名称,而foreach内部所跟随的是监控属性数组的项目,例如firstName和lastName。

当你想引用监控属性数组本身的时候,就可以使用这个特殊的上下文$data,他所指的就是监控属性数组本身。

例如,你的监控属性数组中的项目没有明确的项目名称:

  • The current item is:

ko.applyBindings({

months: [ 'Jan', 'Feb', 'Mar', 'etc' ]

});

如何你愿意的话,也可以使用$data来引用监控数组属性中的项目,例如:

其实这是多此一举的。因为firstName的默认前缀就是$data,所以一般可以省略不写。

备注2:使用$index、$parent和其他的上下文标记

你可能会发现,在示例2中使用了$index来代替了监控属性数组的索引值(从0开始),当然$index是一个监控属性,他会根据数据的变化而自动变化,就像示例2中展示的一样。

而$parent所代表的是在foreach绑定循环外的某个绑定属性,例如:

  • likes the blog post

备注3:使用“as”给foreach绑定项目起个别名

在备注1中,使用$data.varibale的方式访问的监控属性数组的项目,但在有些时候你可以需要给这些项目起个别名,那就是可以使用as,例如:

现在,只要在foreach循环中,使用person,就可以访问数组中的元素了。

也有些嵌套使用的例子,这中会更加复杂一些,例如:

  • :

var viewModel = {

categories: ko.observableArray([

{ name: 'Fruit', items: [ 'Apple', 'Orange', 'Banana' ] },

{ name: 'Vegetables', items: [ 'Celery', 'Corn', 'Spinach' ] }

])

};

ko.applyBindings(viewModel);

备注4:不使用foreach容器并生产内容

在某些情况下,可能需要复制容器标签的内容,例如生成如下DOM:

  • Header item
  • Item A
  • Item B
  • Item C

像这种情况,我们就无法在ul标签中使用foreach绑定,解决这个问题的方法就是使用无容器的foreach绑定:

  • Header item
  • Item

ko.applyBindings({

myItems: [ 'A', 'B', 'C' ]

});

这里使用虚拟元素容器,和。就想之前章节提到的虚拟绑定一样。

备注5:检测并处理数组变化

当您修改模型数组的内容(通过添加,移动或删除其项),在foreach绑定使用一个有效的差分算法计算方法当出发生了什么变化的时候。

当您添加数组项,foreach会使您的模板的新副本,并将其插入到现有的DOM

当你删除数组项,foreach将直接删除相应的DOM元素

当你重新排序数组项(保持相同的对象实例),foreach通常只要将相应的DOM元素融入自己的新位置

备注6:销毁项目

有时你可能想为数据项目做删除标记,但实际上并不真正删除该项目。这中方式被称为非破坏性的删除。

默认情况下,foreach绑定将跳过(即隐藏)标记为删除任何数组项。如果你想显示这些项目,使用includeDestroyed选项。例如,

...

备注7:使用动画过渡,提高用户体验

如果您需要在生成的DOM元素运行一些定制逻辑,你可以使用afterRender/ afterAdd/beforeRemove/ beforeMove/ afterMove这些回调函数。

下面是一个使用afterAdd的一个简单的例子,应用经典的“黄色淡出”的效果,以新增项目。它需要的jQuery插件的颜色,使背景色彩的动画。

源码如下:

Add

ko.applyBindings({

myItems: ko.observableArray([ 'A', 'B', 'C' ]),

yellowFadeIn: function(element, index, data) {

$(element).filter("li")

.animate({ backgroundColor: 'yellow' }, 200)

.animate({ backgroundColor: 'white' }, 800);

},

addItem: function() { this.myItems.push('New item'); }

});

一些具体的细节

afterRender-当foreach第一次初始化执行的回调函数。KO提供下列参数回调:

插入的DOM元素的数组

数据项

afterAdd-当foreach添加新项目后的回调函数。KO提供下列参数回调:

DOM节点

添加的数组元素的索引

添加的数组元素

beforeRemove-当一个数组项已被删除的回调函数。这里最明显的用jQuery的$(domNode).fadeOut()动画去除相应的DOM节点。KO提供下列参数回调:

删除一个DOM节点

被删除的数组元素的索引

删除的数组元素

beforeMove-当一个数组项在数组中已经改变了位置的回调函数,但之前相应的DOM节点已被移动。需要注意的是beforeMove适用于所有的数组元素的指标发生了变化,因此,如果你在一个数组的开头插入一个新的项目,然后回调(如果指定)将触发所有其他元素,因为它们的索引位置增加了一个。您可以使用beforeMove存储在受影响元素的原始屏幕坐标,这样你可以在afterMove回调动画动作。KO提供下列参数回调:

可能是移动的DOM节点

移动的数组元素的索引

移动的数组元素

afterMove-数组项在数组中已经改变位置的回调函数,KO提供下列参数回调:

可能已经移动的DOM节点

移动的数组元素的索引

移动的数组元素

以上所述是小编给大家介绍的KnockoutJS 3.X API 第四章之数据控制流foreach绑定,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

knockoutjs ajax分页,KnockoutJS 3.X API 第四章之数据控制流foreach绑定相关推荐

  1. KnockoutJS 3.X API 第四章 表单绑定(11) options绑定

    目的 options绑定主要用于下拉列表中(即<select>元素)或多选列表(例如,<select size='6'>).此绑定不能与除<select>元素之外的 ...

  2. 对接亚马逊 SP-API(Amazon Selling Partner API) 第四章:签名

    目录 1. 前提概要 2. Authorization 介绍 Python 版本完整案例 3. 拼接 Authorization Task 1: Create a canonical request ...

  3. 对接亚马逊 SP-API(Amazon Selling Partner API) 第三章:对接 SDK

    目录 必要条件 1. Generating a Java SDK with LWA token exchange and authentication 1.8. SwaggerToCL 结构. 1.9 ...

  4. Ajax怎么获取天气,Ajax获取全国天气预报的API数据

    这次给大家带来Ajax获取全国天气预报的API数据,Ajax获取全国天气预报API数据的注意事项有哪些,下面就是实战案例,一起来看一下. 预览图(比较简单粗糙) 聚合数据全国天气预报接口:https: ...

  5. 自定义ajax脚本出粗哦,jQuery DataTables插件自定义Ajax分页实例解析

    一.问题描述 园友是做前端的,产品经理要求他使用jQuery DataTables插件显示一个列表,要实现分类效果. 后端的分页接口已经写好了,不涉及条件查询,需要传入页码(pageNo)和页面显示数 ...

  6. yii2 分页ajax,yii2的分页和ajax分页

    要想使用Yii分页类 第一步:在控制器层加载分页类 use yii\data\Pagination; 第二步: 使用model层查询数据,并用分分页,限制每页的显示条数 $data = User::f ...

  7. Web API With AJAX: Handle Session in Web API

    Web API With AJAX: Handle Session in Web API 转载于:https://www.cnblogs.com/caojinqin/p/4642016.html

  8. java ajax jquery分页插件_分享精心挑选的12款优秀jQuery Ajax分页插件和教程

    摘要:这篇jQuery栏目下的"分享精心挑选的12款优秀jQuery Ajax分页插件和教程",介绍的技术点是"jquery_ajax分页插件.jquery_ajax.a ...

  9. PHP、jQuery、jQueryPager结合实现Ajax分页

    建立html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

最新文章

  1. Android之记录并研究Volley框架中知识点
  2. Mnist 0的波函数
  3. python字符串去掉特殊符号和空格_从字符串中删除所有特殊字符,标点符号和空格...
  4. mysql获取多张表中的数据_mysql 之多表查询
  5. Dubbo-Admin 2.7 本地安装和部署
  6. 蓝桥杯ALGO-147算法训练 4-3水仙花数
  7. UVA11384 Help is needed for Dexter【数学】
  8. 偏向锁理论太抽象,实战了解下偏向锁如何发生以及如何升级【实战篇】
  9. 引爆Spark大数据引擎的七大工具
  10. 【一起学Rust | 设计模式】新类型模式
  11. pandas 缺省值与空值处理
  12. cmake + googletest 之一 入门
  13. 提取LSV中的高程数据在CAD中进行道路的方案设计流程
  14. 利用AXIS开发Webservice(三) —— 如何传递JavaBean和你的对象
  15. 财经小知识:美国国债
  16. 在线ARM仿真器知识(嵌入式系统设计师必备)
  17. 数据库设计学习①:数据库设计简介
  18. html3d旋转效果相册,HTML5css3:3D旋转木马效果相册
  19. 线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
  20. java基于微信小程序的超市购物商城系统 小程序 uniapp

热门文章

  1. 斐波那契数 c 语言实现
  2. python随机数程序源码_Python 实现随机数详解及实例代码
  3. python怎么开发安卓程序_怎样用python开发安卓app-到底如何使用Python开发Android程序.txt...
  4. bsc是指什么_掌握BSC,实现企业数字化管理
  5. 06540计算机网络考试大纲,2020年自考06540计算机网络基本原理复习资料(7)
  6. mysql主备在同一台_MySQL高可用(一)主备同步:MySQL是如何保证主备一致的
  7. 前端dashboard框架_微前端在网易七鱼的实践
  8. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第9章-固定翼飞行器的编队跟踪与队形旋转控制
  9. FPGA实现数字信号处理的定点运算
  10. 【DIY】废物利用,最简单粗暴便宜的DIY定时器方法,没有之一