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

Jquery 将模板项绑定到KnockoutJS中数组的索引,jquery,knockout.js,Jquery,Knockout.js,我需要根据Jquery插件列表中出现的位置,在KnockoutJS模板中命名,如下所示: <div id="item1">...</div> <div id="item2">...</div> <div id="item3">...</div> 。。。 ... ... 有没有办法使用KnockoutJS绑定到数组中项的索引? 如果我必须使用ROWINDEX将此数据添加到数据库上的select中,那将是一件非常遗憾的事情。

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

<div id="item1">...</div>
<div id="item2">...</div>
<div id="item3">...</div>
。。。
...
...
有没有办法使用KnockoutJS绑定到数组中项的索引?
如果我必须使用ROWINDEX将此数据添加到数据库上的select中,那将是一件非常遗憾的事情。

更新:KO现在支持一个
$index
上下文变量,您可以在
foreach
中使用该变量(或
模板
foreach
参数一起使用)。文档:

如果您可以使用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>
编辑:现在我更喜欢创建一个对ObservalArray的订阅,该订阅只需通过数组一次,并在项目上创建/设置一个可观察的索引。比如:

//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);
//每当数组更改时,将索引附加到项
viewModel.tasks.subscribe(函数(){
var tasks=this.tasks();
for(var i=0,j=tasks.length;i
此处示例:

或者,您可以利用这个想法,扩展ObservableArray,以提供一个
索引的
函数,该函数允许您只需调用
myObservableArray.indexed()
,即可进行设置


下面是一个示例:

有相同的问题,但是foreach模板的源是一个依赖的可观察对象, 唉,ko.utils.arrayIndexOf不起作用

解决方案:创建了一个函数,该函数重新创建Dependent Observable返回的数组,并简单地将js indexOf函数用于项:

arrayIndexDO: function (item) {
    var filteredArray = ko.utils.arrayFilter(viewModel.someObservableArray(), function (element) {
        return element.id() == view.selectedId();
    });
    var index = filteredArray.indexOf(item);
    return index;
}

等等,jQuery tpl中的预期索引。

这在淘汰2.1.0及以上版本中更容易实现:

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

不需要花哨的脚本


警告一句:
attr:{id:'item'+$index}
将不起作用。由于
$index
本身就是一个函数,如果不添加括号,将导致您的id是“item”和整个函数定义的串联

第二个方法的另一个选项是向模型中添加一个“Index”属性,该属性返回与ko.utils.arrayIndexOf(…等)相同的值-我发现它在很多情况下解决了我的问题:-)最后一次修改Index()方法很容易是最好的答案,因为它很容易重用。
<div data-bind="foreach: items">
   <div data-bind="attr: { id : 'item' + $index() }"></div>
</div>