【发布时间】:2014-07-31 21:37:58
【问题描述】:
这是问题的一个示例,在这种情况下,有人选择披萨的配料(我的现实世界问题与此类似): http://jsfiddle.net/csabatoth/aUH2C/4/
HTML:
<h2>Pizza toppings (<span data-bind="text: toppings().length"></span>)</h2>
<table class="table table-bordered">
<thead><tr>
<th>Topping</th><th>Number of units</th>
</tr></thead>
<tbody data-bind="foreach: toppings">
<tr>
<td><select data-bind="options: $root.availableToppings(), value: name, optionsText: 'name'"></select></td>
<td><input data-bind="value: num" /></td>
<td><a href="#" data-bind="click: $root.removeTopping">Remove</a></td>
</tr>
</tbody>
</table>
<button type="button" class="btn btn-primary" data-bind="click: addTopping, enable: toppings().length < 5">Add another topping</button>
JS:
// Class to represent a possible topping
function Topping(name) {
var self = this;
self.name = name;
// This will have other properties
}
// Class to represent a row in the grid
function ToppingRow(topping, num) {
var self = this;
self.topping = ko.observable(topping);
self.num = ko.observable(num);
self.toppingName = ko.computed(function() {
return self.topping().name;
});
}
function ToppingsViewModel() {
var self = this;
// Non-editable catalog data - would come from the server
self.availableToppings = ko.observableArray([
new Topping("Mushroom"),
new Topping("Pepperoni"),
new Topping("Cheese"),
new Topping("Olives"),
new Topping("Chicken")
]);
// Editable data
self.toppings = ko.observableArray([
new ToppingRow(self.availableToppings()[0], 1)
]);
// Operations
self.addTopping = function() {
self.toppings.push(new ToppingRow(self.availableToppings()[0], 1));
}
self.removeTopping = function(topp) { self.toppings.remove(topp) }
}
ko.applyBindings(new ToppingsViewModel());
我想要的是:当用户选择一个浇头时,该选项应该从弹出列表中消失。一旦用户删除了顶部,它应该重新出现在弹出窗口中。换句话说:我不希望用户多次添加相同的浇头。该怎么做?
(或者现在我想如果我应该以一种完全不同的方式来处理这个问题,并且会在左侧有一个带有浇头的列表,并且用户可以从那里拖放到正确的目的地列表......)。在现实世界的例子中,我认为“浇头”的数量可能有几十个。
【问题讨论】:
标签: javascript html knockout.js binding