I have 2 values that I get from server A and B. I can only have one true at a time.
Again what I need is one of the radios to be checked at a time so one true value only.
var viewModel = { radioSelectedOptionValue: ko.observable("false"), A: ko.observable("false"), B: ko.observable("false") }; ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.1.0/knockout-min.js"></script> <div class='liveExample'> <h3>Radio View model</h3> <table> <tr> <td class="label">Radio buttons:</td> <td> <label><input name="Test" type="radio" value="True" data-bind="checked: A" />Alpha</label> <label><input name="Test" type="radio" value="True" data-bind="checked: B" />Beta</label> </td> </tr> </table> A-<span data-bind="text: A"></span> B-<span data-bind="text: B"></span> </div>
To activate Knockout, add the following line to a <script> block: ko. applyBindings(myViewModel); You can either put the script block at the bottom of your HTML document, or you can put it at the top and wrap the contents in a DOM-ready handler such as jQuery's $ function.
This binding is used to create a link between a checkable form element and ViewModel property. Mostly these form elements are inclusive of check box and radio buttons.
The checked binding links a checkable form control — i.e., a checkbox ( <input type='checkbox'> ) or a radio button ( <input type='radio'> ) — with a property on your view model. When the user checks the associated form control, this updates the value on your view model.
The $data variable is a built-in variable used to refer to the current object being bound. In the example this is the one of the elements in the viewModel.
Knockout 3.x added the checkedValue binding option. This allows you to specify values other than strings.
<input name="Test" type="radio" data-bind="checked: radioSelectedOptionValue, checkedValue: true" /> <input name="Test" type="radio" data-bind="checked: radioSelectedOptionValue, checkedValue: false" />
http://jsfiddle.net/t73d435v/
The checked
binding works differently for radio buttons and checkboxes:
From the documentation:
For radio buttons, KO will set the element to be checked if and only if the parameter value equals the radio button node’s
value
attribute. So, your parameter value should be a string.
So you need to set the value
attribute of your inputs to "A" and "B" and then bind to the radioSelectedOptionValue
which will contain "A" or "B" depending on which options is selected:
<label> <input name="Test" type="radio" value="A" data-bind="checked: radioSelectedOptionValue" /> Alpha </label> <label> <input name="Test" type="radio" value="B" data-bind="checked: radioSelectedOptionValue" /> Beta </label>
If you want to keep your boolean properties: A
and B
, you need to make them ko.computed
(read-only, writable) which will use/convert the value of the radioSelectedOptionValue
:
this.radioSelectedOptionValue = ko.observable(); this.A = ko.computed( { read: function() { return this.radioSelectedOptionValue() == "A"; }, write: function(value) { if (value) this.radioSelectedOptionValue("A"); } }, this);
Demo JSFiddle.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With