假设您的商品如下所示:
var Item = function(name, group) {
this.name = name;
this.group = group;
}
它们在一个可观察的数组中:
var items = ko.observableArray([
new Item("Item1", "group1"),
new Item(/* ... */),
/* et cetera */
]);
要创建一个包含所有按组排序的项目的对象,请创建一个计算对象:
var itemsByGroup = ko.computed(function() {
return items().reduce(function(result, item) {
if (!result[item.group]) {
result[item.group] = [];
}
result[item.group].push(item);
return result;
}, {});
});
您需要创建一个计算出的二维数组以使用剔除foreach 绑定。
var itemGroups = ko.computed(function() {
return Object.keys(itemGroups())
.map(function(key) { return itemGroups()[key]});
});
现在,您可以使用 HTML 标记创建列表,如下所示:
<ul data-bind="foreach: itemGroups">
<li>
<ul data-bind="foreach: $data">
<li data-bind="text: name"></li>
</ul
</li>
<ul>
如果要添加组标签等,可以返回具有label 属性的对象和items 数组中的项目。使用下面的小提琴进行实验:
var Item = function(name, group) {
this.name = name;
this.group = group;
}
var items = ko.observableArray([
new Item("1", "A"),
new Item("2", "A"),
new Item("3", "B"),
new Item("4", "C")
]);
var itemsByGroup = ko.computed(function() {
return items().reduce(function(result, item) {
if (!result[item.group]) {
result[item.group] = [];
}
result[item.group].push(item);
return result;
}, {});
});
var groupedArray = ko.computed(function() {
var grouped = itemsByGroup();
return Object.keys(grouped)
.map(function(key) {
return grouped[key]
});
});
ko.applyBindings({
groupedArray: groupedArray
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<ul data-bind="foreach: groupedArray">
<li>
<ul data-bind="foreach: $data">
<li data-bind="text: name"></li>
</ul
</li>
<ul>