Jquery 将模板项绑定到KnockoutJS中数组的索引
我需要根据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中,那将是一件非常遗憾的事情。
,如下所示:
<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>