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

我需要根据它们出现在Jquery插件列表中的位置在KnockoutJS模板中命名

's

 
...
...
...

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

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

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

 

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

 

编辑:这些天我更喜欢创建对我的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); 

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

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

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

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

 

不需要花哨的脚本。

提醒一句: attr: { id : 'item' + $index }不起作用。 由于$index本身就是一个函数,因此无法添加括号将导致您的id成为’item’和整个函数定义的串联!

有同样的问题,但使用dependantObservable作为foreach模板的源,唉ko.utils.arrayIndexOf不起作用…

解决方案:创建了一个函数,它重新创建了dependantObservable返回的数组,并简单地将js indexOf函数与Item一起使用:

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

Etvoilà,jQuery tpl中的预期索引。