JSFiddle - React, Tailwind, and code Playground
by Shrikrishna Gupta
HTML
<script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js"></script>
Selection List
<a class="pull-right" href="#" data-bind="click: addChoice">+</a>
<table class="selection" data-bind="foreach: Choices">
<tr>
<td>
<input type="text" data-bind="value: Id" />
</td>
<td>
<input type="text" data-bind="value: Text" />
</td>
</tr>
</table>
Checkbox Values: <br />
<!-- ko foreach: {data: Choices() } -->
<input type="checkbox" data-bind="checkedInArray: $root.Values" /><span data-bind="text: Text" ></span><br />
<!-- /ko -->
Radio Value: <br />
<!-- ko foreach: {data: Choices() } -->
<input type="radio" data-bind="checkMe: $root.Value" /><span data-bind="text: Text" ></span><br />
<!-- /ko -->
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
JavaScript
if (!ko.utils.addOrRemoveItem) {
ko.utils.addOrRemoveItem = function(array, value, included) {
var existingEntryIndex = array.indexOf ? array.indexOf(value) : ko.utils.arrayIndexOf(array, value);
if (existingEntryIndex < 0) {
if (included)
array.push(value);
} else {
if (!included)
array.splice(existingEntryIndex, 1);
}
};
}
ko.bindingHandlers.checkMe = {
init: function (element, valueAccessor, all, vm, bindingContext) {
ko.utils.registerEventHandler(element, "click", function() {
var checkedValue = valueAccessor(),
meValue = bindingContext.$data,
checked = element.checked;
if (checked && ko.isObservable(checkedValue)) {
checkedValue(meValue);
}
});
},
update: function (element, valueAccessor, all, vm, bindingContext) {
var checkedValue = ko.utils.unwrapObservable(valueAccessor()),
meValue = bindingContext.$data;
element.checked = (checkedValue === meValue);
}
};
ko.bindingHandlers.checkedInArray = {
init: function (element, valueAccessor, all, vm, bindingContext) {
ko.utils.registerEventHandler(element, "click", function() {
var array = valueAccessor(), // don't unwrap array because we want to update the observable array itself
value = bindingContext.$data,
checked = element.checked;
ko.utils.addOrRemoveItem(array, value, checked);
});
},
update: function (element, valueAccessor, all, vm, bindingContext) {
var array = ko.utils.unwrapObservable(valueAccessor()),
value = bindingContext.$data;
element.checked = ko.utils.arrayIndexOf(array, value) >= 0;
}
};
function VM () {
var self = this
self.Value = ko.observable()
self.Values = ko.observableArray([])
self.Choices =...