手机版

第4章中的每个绑定的数据控制流 十、原料药

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

Foreach绑定

Foreach绑定主要用于循环显示和监控数组属性中的每一个元素,一般用于表标签中

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

当然,它也可以用于其他控制流,例如if和with。

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

此示例适用于foreach绑定,并在循环中的表标记中显示监视属性数组的内容

tableheadthrthfirst name/thththlast name/th/tr/the dtbody data-bind=' foreach : people ' trtd data-bind=' text : first name '/tdtd data-bind=' text : last name '/TD/tr/t body/tablescript type=' text/JavaScript ' ko . applybindings({ people :[{ first name : ' Bert ',lastName: 'Bertington' },/script示例2:添加或删除项目

用户界面源代码:

h4People/h4ul数据-bind=' foreach : people ' span数据-bind=' text : $ index '/span : span数据-bind=' text : name '/Spana href=' # '数据-bind=' click : $ parent . remove person ' remove/a/Li/ul button数据-bind=' click 3: addperson ' add/button view模型源代码:

函数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 . remove person=function(){ self . people . remove(this);}}ko.applyBindings(新的AppViewModel());注1:使用$数据

与前面两个示例一样,foreach后面是要循环的监控属性数组的名称,而foreach后面是监控属性数组的项目,如名字和姓氏。

当您想要引用监控属性数组本身时,可以使用这个特殊的上下文$data,它引用监控属性数组本身。

例如,监视属性数组中的项目没有显式的项目名称:

ul data-bind=' foreach : months '当前项目为: b data-bind=' text : $ data '/Li/ulscript type=' text/JavaScript ' ko . applybindings({ months :[' Jan ',' Feb ',' Mar ',' etc ']});/script如果愿意,还可以使用$data来引用monitoring array属性中的项,例如:

TD data-bind=' text : $ data . first name '/TD,其实这是多余的。因为firstName的默认前缀是$data,所以一般不用写就可以省略。

注意2:使用$index、$parent和其他上下文标签

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

并且$parent表示foreach绑定循环之外的绑定属性,例如:

h1 data-bind=' text : blogPostTitle '/H1ul data-bind=' foreach : likes ' libdata-bind=' text 3360 name '喜欢这篇博文b data-bind=' text 3360 $ parent . blog post title '/Li/ul注意3:使用“as”为foreach绑定项指定一个单独的名称

在注释1中,监控属性数组的项目是以$ data.varibale的方式访问的,但是有时您可能需要给这些项目单独命名,也就是说,您可以使用,例如:

ul data-bind=' foreach : { data : people,as:' person'}'/ul现在,只要在foreach循环中使用person,就可以访问数组中的元素。

还有一些嵌套使用的例子,它们会更复杂,例如:

ul数据-绑定=' foreach : { data : categories,as: 'category' }'liul数据-绑定='foreach: { data: items,as: ' item ' } ' lispan数据-绑定=' text : categories . name '/span : span数据-绑定=' text : items '/span/Li/ul/Li/ulscriptvar viewModel={ categoris 3333333ko . applybindings(viewModel);/script注释4:不要使用foreach容器并生成内容

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

ulli class='header '表头项目/li!-以下是从数组动态生成的-Li项目a/Li项目b/Li项目c/Li/ul这样,我们就不能在ul标签中使用foreach绑定。这个问题的解决方案是使用无容器foreach绑定:

ulli class='header '表头项目/li!-ko foreach : MyItems-LiItem span data-bind=' text : $ data '/span/Li!-/ko-/ulscript type=' text/JavaScript ' ko . applybindings({ myitems :[' A ',' B ',' C ']});/script在这里,我们使用虚拟元素容器!- ko -还有!- /ko -.就像上一章提到的虚拟绑定一样。

注5:检测和处理阵列变化

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

当您添加数组项时,foreach将创建一个新的模板副本,并将其插入到现有的DOM中。删除数组项时,foreach会直接删除对应的DOM元素。当您对数组项重新排序时(保持相同的对象实例),foreach通常只需要将相应的DOM元素集成到它的新位置

注6:销毁物品

有时,您可能想要标记要删除的数据项,但实际上并没有删除它。这种方法称为非破坏性删除。

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

Div数据-bind=' foreach : { data : my array,include destroyed 3360 true } './div注7:使用动画过渡来改善用户体验

如果需要对生成的DOM元素运行一些自定义逻辑,可以使用这些回调函数:after render/after add/before remove/before move/after move。

下面是一个使用afterAdd的简单示例,应用经典的“黄色淡出”效果来添加新项目。它需要jQuery插件的颜色来制作动画背景颜色。

源代码如下:

ul数据-绑定=' foreach : { data : myItems,afterAdd: yellowFadeIn } ' li数据-绑定='text: $data'/li/ulbutton数据-绑定=' click : addItem ' add/button script type=' text/JavaScript ' ko . applybindings({ myItems : ko . observablearray([' A ',' B ',' C' ]),yellowFadeIn: function(元素过滤器(' li ')。动画({ backgroundColor: '黄色' },200)。动画({ backgroundColor: 'white' },800);},addItem:函数(){ this . myitems . push(' New item ');}});/编写一些具体细节

after render-foreach首次初始化执行的回调函数时。KO提供以下参数回调:

插入的DOM元素的数组

数据项目

after ADd-foreach添加新项后的回调函数。KO提供以下参数回调:

由DOM节点添加的数组元素的索引添加数组元素

BeforeRemove-删除数组项时的回调函数。在这里,移除相应DOM节点最明显的方法是使用jQuery的$(domNode)。fadeOut()动画。KO提供以下参数回调:

删除一个DOM节点

已删除数组元素的索引

已删除数组元素

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

可能是一个移动的DOM节点

移动的数组元素的索引

移动的数组元素

AfterMove-一个回调函数,其中数组项已经改变了它在数组中的位置。KO提供以下参数回调:

可能已被移动的DOM节点

移动的数组元素的索引

移动的数组元素

以上是第三章第四章数据控制流的foreach绑定。边肖引进的原料药。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:第4章中的每个绑定的数据控制流 十、原料药是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。