我有一个computed
observableArray
被调用者,它从另一个被调用者selectedToppings
返回过滤后的数据。 应该返回所有属性设置为的浇头。在某些情况下,只能选择一种浇头,例如客户订购儿童大小的冰淇淋时。这是我的代码。observableArray
toppings
selectedToppings
observable
selected
true
<label>Multiple Toppings:
<input type="checkbox" data-bind="checked: multiselectable" />
<em data-bind="if: !multiselectable()">pick only one topping</em>
</label>
<h2>Available</h2>
<ul data-bind="foreach: toppings">
<li data-bind="text: label, click: selected.bind($data, true)"></li>
</ul>
<h2>Selected</h2>
<ul data-bind="foreach: selectedToppings">
<li data-bind="text: label, click: selected.bind($data, false)">
</li>
</ul>
<script>
function Topping(options) {
this.label = ko.observable(options.label);
this.selected = ko.observable(false);
}
var iceCream = {
toppings: ko.observableArray([
new Topping({label: 'Sprinkles'}),
new Topping({label: 'Marshmallows'}),
new Topping({label: 'Nuts'})
]),
multiselectable: ko.observable(false)
};
iceCream.selectedToppings = ko.computed(function () {
return ko.utils.arrayFilter(iceCream.toppings(), function(item){
return item.selected();
});
});
var selectedSub = iceCream.selectedToppings.subscribe(function (toppings) {
if (!this.multiselectable()) {
if (toppings.length > 1) {
var item = toppings.shift();
item.selected(false);
}
}
}, iceCream);
ko.applyBindings(iceCream);
</script>
也在jsfiddle上。
availableToppings
如果应该遵循它,我正在使用订阅来强制执行单顶规则。此实现不起作用,我不知道如何修复它。
什么不起作用:
- 确保未选中多选。
- 单击可用洒水。
- 单击可用的棉花糖。
- 单击可用的坚果。
- 单击可用洒水。
- 注意选择是如何没有改变的。