我用淘汰赛开发了一个项目。我找到了一种方法可以使用敲除绑定和optgroup进行选择。以下是解决方案:http://jsfiddle.net/HPhmB/3/
不幸的是,这个解决方案使用静态模型来填充'选项'和&选择中的'optgroup'。
为了个人需要,我想要一些更有活力的东西。我想从数据库提供的observableArray开始。这个observableArray看起来像这样:
var vehicles = ko.observableArray([
{
Id: 1,
Brand: "Volkswagen",
Type: "Golf"
},
{
Id: 2,
Brand: "Volkswagen",
Type: "Sharan"
},
{
Id: 3,
Brand: "BMW",
Type: "118i"
}
{
Id: 4,
Brand: "BMW",
Type: "525D"
}
]);
我的问题:是否可以使用基于此单个observableArray的解决方案来构造select。也许借助计算属性来检索optgroup / options?
感谢。
答案 0 :(得分:9)
以下是执行此操作的方法之一。它不是最佳的,但效果很好:
var ViewModel = function () {
var self = this;
self.vehicles = ko.observableArray([{
Id: 1,
Brand: "Volkswagen",
Type: "Golf"
}, {
Id: 2,
Brand: "Volkswagen",
Type: "Sharan"
}, {
Id: 3,
Brand: "BMW",
Type: "118i"
}, {
Id: 2,
Brand: "BMW",
Type: "525D"
}]);
self.brands = ko.computed(function(){
var list = ko.utils.arrayMap(self.vehicles(), function(item){
return item.Brand;
});
return ko.utils.arrayGetDistinctValues(list);
});
};
ko.applyBindings(new ViewModel());
<select data-bind="foreach: brands">
<optgroup data-bind="attr: {label: $data}, foreach: $parent.vehicles">
<!-- ko if: Brand == $parent -->
<option data-bind="text: Type"></option>
<!-- /ko -->
</optgroup>
</select>