Подтвердить что ты не робот

Радио кнопки Knockoutjs

У меня есть 2 значения, которые я получаю от серверов A и B. У меня может быть только одно истинное за раз.

Снова то, что мне нужно, это одно из радиостанций, которые нужно проверять одновременно, но только одно истинное значение.

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>
4b9b3361

Ответ 1

Связывание checked работает по-разному для переключателей и флажков:

Из documentation:

Для переключателей KO устанавливает элемент, который будет проверяться , если и только если значение параметра равно значению переключателя node s value. Итак, ваше значение параметра должно быть строкой.

Итак, вам нужно установить атрибут value ваших входов на "A" и "B", а затем привязать к radioSelectedOptionValue, который будет содержать "A" или "B", в зависимости от того, какие параметры выбраны:

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

Если вы хотите сохранить свои логические свойства: A и B, вам нужно сделать их ko.computed (только для чтения, перезаписываемый), который будет использовать/преобразовать значение radioSelectedOptionValue:

this.radioSelectedOptionValue = ko.observable();
this.A = ko.computed( {
        read: function() {
            return this.radioSelectedOptionValue() == "A";
        },
        write: function(value) {
            if (value)
                this.radioSelectedOptionValue("A");
        }
    }, this);

Демо JSFiddle.

Ответ 2

Knockout 3.x добавил параметр привязки checkedValue. Это позволяет вам указать значения, отличные от строк.

    <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/