将模板项绑定到KnockoutJS中数组的索引

jaf*_*ffa 10 jquery knockout.js

我需要<div>'s在KnockoutJS模板中根据它们出现在Jquery插件列表中的位置命名,如下所示:

<div id="item1">...</div>
<div id="item2">...</div>
<div id="item3">...</div>
Run Code Online (Sandbox Code Playgroud)

有没有办法使用KnockoutJS绑定到数组中的项目的索引?如果我必须使用ROWINDEX将这些数据添加到数据库中的select,那将是一种耻辱.

RP *_*yer 21

更新:KO现在支持$index您可以在foreach(或template使用foreachparam)中使用的上下文变量.文档:http://knockoutjs.com/documentation/binding-context.html

如果你可以使用jQuery模板{{each}},那么这样的东西将起作用:

<div data-bind="template: 'allItemsTmpl'"></div>
<script id="allItemsTmpl" type="text/html">
    {{each(i, item) items}}
    <div data-bind="attr: { id: 'item' + i }">
        <input data-bind="value: name" />
    </div>
    {{/each}}
</script>
Run Code Online (Sandbox Code Playgroud)

如果你必须使用该foreach选项,那么这样的东西将起作用:

<div data-bind="template: { name: 'itemTmpl', foreach: items }"></div>
<button data-bind="click: addItem">Add Item</button>
<script id="itemTmpl" type="text/html">
    <div data-bind="attr: { id: 'item' + ko.utils.arrayIndexOf(viewModel.items, $data) }">
        <input data-bind="value: name" />
    </div>
</script> 
Run Code Online (Sandbox Code Playgroud)

编辑:这些天我更喜欢创建一个我的observableArray的订阅,只需要一次通过数组并在项目上创建/设置一个索引observable.喜欢:

//attach index to items whenever array changes
viewModel.tasks.subscribe(function() {
    var tasks = this.tasks();
    for (var i = 0, j = tasks.length; i < j; i++) {
       var task = tasks[i];
        if (!task.index) {
           task.index = ko.observable(i);  
        } else {
           task.index(i);   
        }
    }
}, viewModel);
Run Code Online (Sandbox Code Playgroud)

此处示例:http://jsfiddle.net/rniemeyer/CXBFN/

或者您可以采用这个想法并扩展observableArrays以提供一个indexed允许您通过调用来设置它的函数myObservableArray.indexed().

以下是一个示例:http://jsfiddle.net/rniemeyer/nEgqY/

  • 第二种方法的另一个选择是为你的模型添加一个"Index"属性,它返回与ko.utils.arrayIndexOf相同的值(等等 - 我发现它在很多场合解决了我的问题:-) (2认同)

jks*_*der 16

使用Knockout 2.1.0及更高版本时,这更容易:

<div data-bind="foreach: items">
   <div data-bind="attr: { id : 'item' + $index() }"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

不需要花哨的脚本.

提醒一句: attr: { id : 'item' + $index }不行.由于$index是一个函数本身,未添加括号将导致您的id成为'item'和整个函数定义的串联!