foreach绑定

目的

foreach可以将一个数组中的实体循环的进行绑定。这在将一个list显示成table时非常有用。

假设数组是observable的,当在绑定后做了add, remove,或者重新排序后,绑定会找到相应的元素做新增、删除或者排序,而不会影响其他不相关的DOM元素。这比重新生成整个foreach的输出要高效的多。

当然,你也可以任意的使用其他控制语句如if和with来嵌套foreach绑定。

例1:遍历数组

示例使用foreach循环一个数组实体展示成一个只读的table

<table>
    <thead>
        <tr><th>First name</th><th>Last name</th></tr>
    </thead>
    <tbody data-bind="foreach: people">
        <tr>
            <td data-bind="text: firstName"></td>
            <td data-bind="text: lastName"></td>
        </tr>
    </tbody>
</table>

<script type="text/javascript">
    ko.applyBindings({
        people: [
            { firstName: ‘Bert‘, lastName: ‘Bertington‘ },
            { firstName: ‘Charles‘, lastName: ‘Charlesforth‘ },
            { firstName: ‘Denise‘, lastName: ‘Dentiste‘ }
        ]
    });
</script>

例2:使用新增、删除功能

如果数组是observable的,界面会和数组保持同步的。

运行效果:http://knockoutjs.com/documentation/foreach-binding.html  Example 2:Live example with add/remove

<h4>People</h4>
<ul data-bind="foreach: people">
    <li>
        Name at position <span data-bind="text: $index"> </span>:
        <span data-bind="text: name"> </span>
        <a href="#" data-bind="click: $parent.removePerson">Remove</a>
    </li>
</ul>
<button data-bind="click: addPerson">Add</button>
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());

参数

传递你想遍历的数组,绑定会循环每一个实体进行输出。

另外,也可以传递一个叫做data的属性的名称,只要它是一个要遍历的数组。这个对象还可能有其他属性,如afterAdd或includeDestroyed -- 参见下面的说明及例子。

如果传递的数组是observable的,通过foreach绑定的元素会在数组改变后做相应的更新。

注1:使用$data指向数组每一项

像上面的例子中说明的那样,使用foreach绑定可以指向一个数组项的每一个属性。如上面的”例1“指向的是firstName和lastName属性。

如果你不想引用属性,而是要使用数组本身,要怎么办?你可以使用特殊的上下文属性$data。在foreach中,它的意思是”当前项“。例如:

<ul data-bind="foreach: months">
    <li>
        The current item is: <b data-bind="text: $data"></b>
    </li>
</ul>

<script type="text/javascript">
    ko.applyBindings({
        months: [ ‘Jan‘, ‘Feb‘, ‘Mar‘, ‘etc‘ ]
    });
</script>

如果你原因,也可以使用$data做为属性的前缀,如例1可以这样写:

<td data-bind="text: $data.firstName"></td>

但这不是必须的,因为firstName会默认使用$data的。

注2:使用$index, $parent,和其他上下文属性

和你在例2中看到的一样,也可以使用$index,它表示一个从0开始的当前数组索引。$index是observable的,并且当item的index改变时会做更新(如:做了新增、删除项)。

相似的,也可以使用$parent来指向foreach引用数组所在的上一级对象,例如:

<h1 data-bind="text: blogPostTitle"></h1>
<ul data-bind="foreach: likes">
    <li>
        <b data-bind="text: name"></b> likes the blog post <b data-bind="text: $parent.blogPostTitle"></b>
    </li>
</ul>

更多信息请参见binding context properties.

注3:使用“as”给foreach项别名

如注1中,可以使用$data来遍历数组。在某些情况下,给当前项一个别名是非常有用的,如:

<ul data-bind="foreach: { data: people, as: ‘person‘ }"></ul>

现在,在foreach内,都可以使用person来访问当前数组项,它就是people数组。这在使用嵌套的foreach时非常有用,如:

<ul data-bind="foreach: { data: categories, as: ‘category‘ }">
    <li>
        <ul data-bind="foreach: { data: items, as: ‘item‘ }">
            <li>
                <span data-bind="text: category.name"></span>:
                <span data-bind="text: item"></span>
            </li>
        </ul>
    </li>
</ul>

<script>
    var viewModel = {
        categories: ko.observableArray([
            { name: ‘Fruit‘, items: [ ‘Apple‘, ‘Orange‘, ‘Banana‘ ] },
            { name: ‘Vegetables‘, items: [ ‘Celery‘, ‘Corn‘, ‘Spinach‘ ] }
        ])
    };
    ko.applyBindings(viewModel);
</script>

提示:as后面传递的是一个字符串类型,因为你是要重命名一个变量。

时间: 2024-08-26 14:08:59

foreach绑定的相关文章

KnockOut 绑定之foreach绑定(mvc+knockout)

什么时候使用foreach绑定 foreach绑定对于数组中的每一个元素复制一节标记语言,也就是html,并且将这节标记语言和数组里面的每一个元素绑定.当我们呈现一组list数据,或者一个表格的时候,十分有用. 如果你绑定的数组是一个"监控数组" ,observable array,(和wpf里面的ObservableCollection<T>差不多).当你添加或移除,或者重新排序数组里面的元素的时候,会动态的更新UI界面.并且此时并不会影响原先的DOM元素.这样比我们直接

KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定

foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM-插入或去除相关项目或重新排序现有的DOM元素,不影响任何其他的DOM元素. 当然,也可以配合其他控制流一起适用,例如if和with. 示例1:遍历监控属性数组 本例适用foreach绑定,在一个table标签中循环显示监控属性数组的内容 <table> <thead> <tr&g

KnockoutJS学习笔记10:KonckoutJS foreach绑定

KnockoutJS foreach绑定用来处理数组,通常用来将一个数组绑定到一个列表或者table中.在foreach绑定中,我们可以使用if.with等嵌套绑定. 示例代码: <table> <thead> <tr><th>First name</th><th>Last name</th></tr> </thead> <tbody data-bind="foreach: peop

JSTL中foreach与fn表达式

在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri=" http://java.sun.com/jsp/jstl/functions" prefix="fn"%>就可以使用fn标签了. 具体使用方法请参见下表: 函数 描述 fn:contains(string, substring) 如果参数string中包含参数substring,返回true fn:containsIgnoreCa

KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定

if绑定目的 if绑定一般是格式是data-bind=if:attribute,if后所跟属性或表达式的值应为bool值(也可以是非bool值,当非空字符串时则为真),if绑定的作用与visible绑定的作用类似.可控制DOM的显示与隐藏,不一样的地方是,if绑定是物理删除或添加DOM元素. 示例1 该例展示IF绑定的动态删除添加DOM: Display message Here is a message. Astonishing. UI源码: <label><input type=&q

KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定

with绑定的目的 使用with绑定的格式为data-bind="with:attribute",使用with绑定会将其后所跟的属性看作一个新的上下文进行绑定.with绑定内部的所有元素将受到该上下文的约束. 当然,with绑定也可配合if或foreach绑定一起使用. 示例1 <h1 data-bind="text: city"> </h1> <p data-bind="with: coords"> Lati

knockoutJS学习笔记06:ko数组与模板绑定

前面已经介绍了基本的绑定和模板相关知识,接下来就看ko里的数组和模板绑定,数组和模板绑定应该是实际项目中用得比较多的,ko提供了很好的支持. 一.observaleArray 前面的监控属性都是单个对象,用的是ko.observable:有时候后台返回的是一个列表,也就是数组,这个时候就需要用监控数组了.监控数组与监控属性几乎一样,只不过它是一个数组对象,拥有数组的特点.例如:创建一个简单的监控数组: var arr = ko.observableArray(); 也可以开始就进行初始化: ar

Knockoutjs实例 - 属性绑定(Bindings)之流程控制(Control flow)

一.foreach binding 使用此功能可以方便我们循环遍历输出某个数组.集合中的内容. (1).循环遍历输出数组 View Row Code 1 <script type="text/javascript" src="knockout-2.2.0.js"></script> 2   3 <table> 4      <thead> 5          <tr><th>First nam

KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写DOM节点和绑定字符串的回调来定义自定义语法. 预处理绑定字符串 您可以通过为特定绑定处理程序(例如click,visible或任何自定义绑定处理程序)提供绑定预处理程序,来挂钩Knockout的逻辑来解释数据绑定属性. 为此,将预处理函数附加到绑定处理程序: ko.bindingHandlers.y