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);