knockoutjs, bootstrap and dynamic radio buttons group
Example how to make knockoutjs and bootstrap work together and also how to create dynamicaly radio buttons in a group. Most other examples are with static radio buttons.
by Nik Todorov
HTML
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.js"></script>
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<div class="btn-group" data-toggle="buttons" data-bind="foreach: items">
<label class="btn btn-primary">
<input type="radio" name="options" data-bind="checkedValue: $data.id, bsChecked: $root.chosenItem" />
<span data-bind="text: itemName"></span>
</label>
</div>
<pre data-bind="text: JSON.stringify(ko.toJS($root), null, 2)"></pre>
JavaScript
ko.bindingHandlers.bsChecked = {
init: function (element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
var value = valueAccessor();
var newValueAccessor = function () {
return {
change: function () {
value(element.value);
}
}
};
ko.bindingHandlers.event.init(element, newValueAccessor,
allBindingsAccessor, viewModel, bindingContext);
},
update: function (element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
if ($(element).val() == ko.unwrap(valueAccessor())) {
setTimeout(function () {
$(element).closest('.btn').button('toggle');
}, 1);
}
}
}
var viewModel = {
items: ko.observableArray([
{ id: 1, itemName: 'Choice 1' },
{ id: 2, itemName: 'Choice 2' },
{ id: 3, itemName: 'Choice 3' },
{ id: 4, itemName: 'Choice 4' }
]),
chosenItem: ko.observable(2)
};
ko.applyBindings(viewModel);