Spinner Binding
HTML
<script src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css">
<script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.9.0/jquery-ui.min.js"></script>
<table>
<tbody data-bind="foreach: orders">
<tr>
<td data-bind="text: Name"></td>
<td><input type="text" style="width: 100px;" data-bind="spinner: Price, spinnerOptions: { min: 0 } " /></td>
<td><input type="number" style="width: 50px;" data-bind="spinner: VAT" /></td>
<td><input type="number" style="width: 50px;" data-bind="spinner: Number" /></td>
<td data-bind="text: Final"></td>
<td><a href="#" data-bind="click: $parent.removeOrder">Remove</a></td>
</tr>
</tbody>
</table>
<button data-bind="click: save">Save</button>
JavaScript
ko.bindingHandlers.spinner = {
init: function(element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().spinnerOptions || {};
$(element).spinner(options);
//handle the field changing
ko.utils.registerEventHandler(element, "spinchange", function () {
var observable = valueAccessor();
observable($(element).spinner("value"));
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).spinner("destroy");
});
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
current = $(element).spinner("value");
if (value !== current) {
$(element).spinner("value", value);
}
}
};
function Order(name, price, vat, number) {
var self = this;
self.Name = ko.observable(name);
self.Price = ko.observable(price);
self.VAT = ko.observable(vat);
self.Number = ko.observable(number);
self.Final = ko.computed(function() {
return (self.Price() + self.VAT()) * self.Number();
});
}
function ViewModel() {
var self = this;
self.orders = ko.observableArray();
self.removeOrder = function(item) {
self.orders.remove(item);
};
self.save = function() {
alert(ko.toJSON(self));
};
}
var viewModel = new ViewModel();
viewModel.orders.push(new Order("Sugar", 100, 15, 3));
viewModel.orders.push(new Order("Salt", 200, 25, 4));
viewModel.orders.push(new Order("Milk", 200, 35, 1));
ko.applyBindings(viewModel);