Related to: Bootstrap Radio Button Group
HTML:
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary">
<input type="radio" name="options" id="option1" value="1" data-bind="checked: optionsValue"> Option 1
</label>
<label class="btn btn-primary">
<input type="radio" name="options" id="option2" value="2" data-bind="checked: optionsValue"> Option 2
</label>
<label class="btn btn-primary">
<input type="radio" name="options" id="option3" value="3" data-bind="checked: optionsValue"> Option 3
</label>
</div>
<br />
<span data-bind="text: optionsValue"></span>
Javascript:
var ViewModel = function() {
this.optionsValue = ko.observable()
};
ko.applyBindings(new ViewModel());
JsFiddle:
- Without data-toggle: http://jsfiddle.net/fDMM2/
- With data-toggle: http://jsfiddle.net/Kf3tj/1/
I have the above code which I'm trying to get working as I expect it to. The problem is that when data-toggle="buttons"
is added to the btn-group div (as in the Bootstrap 3 example) the knockout binding stops working. If I leave the data-toggle off of the buttons group then the binding works as expected but the button group looks awful. I know that this didn't work in Bootstrap 2 because they didn't actually use the radio input for their radio styling. How come it refuses to work now even though they do?
There's a simple solution here that I'm surprised hasn't been mentioned yet.
1) Remove the
data-toggle="buttons"
from the btn-groupNow knockout should be working
2) Bootstrap applies custom css for these inputs to hide them, that we just lost by removing the data-toggle, so apply the following css to the radio inputs:
3) Last thing we need is for the selected option's button to have the active class. Add the following to the label buttons:
I can't take credit for this since once on my coworkers came up with it but it works really well.
change the handler @nemesv proposed to be this: and it worked in my app just fine.
There is a much easier approach found here.
We can just not use the
data-toggle
attribute and try to achieve the same behavior using knockout's data binding.It's almost as simple as the native html radios.
Knockstrap appears to be a binding between Bootstrap and Knockout, and it appears to be kept pretty well up to date. Concerning radio buttons in specific, they utilize this code:
The bootstrap buttons and the knockout
checked
binding are still not playing nice:click
event inside thechecked
binding to tigger the underlaying observable to changee.preventDefault()
so KO won't be notified about the click.One possible solution is to create a custom binding handler where you subscribe on the
change
event (this is fired by bootstrap on toogle) and set your observables value there:And use it in your view with:
Original demo using Bootstrap 3.0.2 JSFiddle.
Updated demo using Bootstrap 3.2.0 JSFiddle.