Я знаю, что мой ответ немного запаздывает с этой игрой, но у меня была эта проблема сегодня, и это был самый близкий поток, который я мог найти, связанный с этой проблемой, и, похоже, нет ответа, который решает ее.Итак, вот мое решение.
По сути, проблема в том, что нокаут действительно хочет, чтобы ваши значения viewModel были строковыми, а не логическими, но это не всегда практично.Итак, я создал привязку под названием isChecked, которая работает строго с логическими значениями. Примечание : Это будет работать только с наблюдаемыми свойствами.
ko.bindingHandlers.isChecked = {
getElementDeclaredValue: function (element) {
var declaredValue = element.getAttribute("value");
// If a value is provided, we presume it represents "true",
// unless its explicitly "false". If no value is provided, we
// presume that a checked state would equal "true".
return declaredValue && Boolean.isBool(declaredValue)
? Boolean.parse(declaredValue)
: true;
},
init: function (element, valueAccessor) {
var updateHandler = function () {
var declaredValue = ko.bindingHandlers.isChecked.getElementDeclaredValue(element);
var elementValue = element.checked ? declaredValue : !declaredValue;
var modelValue = valueAccessor();
var currentValue = ko.utils.unwrapObservable(modelValue);
if (elementValue === currentValue)
return;
if (ko.isObservable(modelValue)) {
modelValue(elementValue);
}
};
ko.utils.registerEventHandler(element, "click", updateHandler);
},
update: function (element, valueAccessor) {
var elementValue = ko.bindingHandlers.isChecked.getElementDeclaredValue(element);
element.checked = elementValue === ko.utils.unwrapObservable(valueAccessor());
}
};
Два логических метода ("parse" и "isBool") определены следующим образом:
Boolean.isBool = function (value) {
return (/^(?:true|false)$/i).test(value);
};
Boolean.parse = function (value) {
return (/^true$/i).test(value);
};
Я проигнорирую любые комментарии, которые говорят, что я не должен изменять встроенный прототип объекта;Я сделаю так, как мне хорошо, пожалуйста; -).
Использование такое же, как проверенное связывание.Атрибут «value» является необязательным, если только вы не хотите, чтобы проверенное состояние представляло ложное:
<input type="radio" id="rbNewClaim" name="ClaimType" value="false" data-bind="checked: isExistingClaim" />
Надеюсь, это кому-нибудь поможет.