您可以创建一个计算来配对项目,如下所示:
self.rows = ko.computed(function(){
var allItems = self.resultData();
var rows = [];
for(var i = 0, len = allItems.length; i < len; i = i+2){
rows.push({
leftItem: allItems[i],
rightItem: i + 1 < len ? allItems[i + 1] : null
});
}
return rows;
});
然后您将绑定到rows
属性而不是直接绑定到resultData
财产。
编辑:@GOK 在评论中要求提供一个允许在单行中自定义项目数量的版本。
您可以通过执行以下操作轻松实现此目的:
self.itemsOnEachRow = ko.observable(2);
self.rows = ko.computed(function(){
var allItems = self.resultData();
var itemsPerRow = self.itemsOnEachRow();
var rows = [];
for(var i = 0, len = allItems.length; i < len; i = i + itemsPerRow){
var row = {};
for(var itemIndex = 0; itemIndex < itemsPerRow; itemIndex++){
var item = null;
if (i + itemIndex < len){
item = allItems[i + itemIndex];
}
row['item' + itemIndex] = item;
}
rows.push(row);
}
return rows;
});
每行都会有名为的属性item1
, item2
等,以设置的项目数itemsOnEachRow
可观察(如果总项目数不能被每行项目数整除,其中一些属性可能包含空引用)。
我已经写了一个关于此的示例,您可以在http://jsfiddle.net/af7P2/ http://jsfiddle.net/af7P2/,但我不建议按照该示例中的方式绑定表。我不确定它将如何设置订阅,但它可能会多次订阅columns
每行计算一次。它只是为了显示一个示例rows
计算出来的,不为别的。
如果您希望每一行本身都是一个数组,可以使用以下代码来实现:
self.itemsOnEachRow = ko.observable(2);
self.rows = ko.computed(function(){
var allItems = self.resultData();
var itemsPerRow = self.itemsOnEachRow();
var rows = [];
for(var i = 0, len = allItems.length; i < len; i = i + itemsPerRow){
var row = [];
for(var itemIndex = 0; itemIndex < itemsPerRow; itemIndex++){
var item = null;
if (i + itemIndex < len){
item = allItems[i + itemIndex];
}
row.push(item);
}
rows.push(row);
}
return rows;
});
此版本的绑定(您可以在http://jsfiddle.net/af7P2/1/ http://jsfiddle.net/af7P2/1/)好一点,因为它不使用columns
为每一行计算一次。
一般来说,根据您的具体情况,此解决方案可能表现不佳。任何项目的添加/删除resultData
数组,或更改itemsOnEachRow
值,将重新绑定整个表。对您来说可能不是问题,只是需要注意的事情。