你checkedValue
結合成爲一個功能如下:
function() {
return {
data: $data,
index: $index(),
};
}
每次checked
綁定更新,它會調用這個函數來獲取價值。但該函數總是返回一個新的對象。即使對象包含相同的數據,Knockout也不會將它們視爲相同。
您可以通過將該值設置爲字符串來解決此問題。
<input type="radio" data-bind="
checkedValue: JSON.stringify({
data: $data,
index: $index(),
}),
checked: $parent.checkedVal
"/>
或者通過綁定到一致的值。
<input type="radio" data-bind="
checkedValue: $data,
checked: $parent.checkedVal
"/>
編輯:
您可以使用遵循相同的模式爲checked
,但允許比較功能的自定義綁定。
ko.bindingHandlers.radioChecked = {
init: function (element, valueAccessor, allBindings) {
ko.utils.registerEventHandler(element, "click", function() {
if (element.checked) {
var observable = valueAccessor(),
checkedValue = allBindings.get('checkedValue');
observable(checkedValue);
}
});
},
update: function (element, valueAccessor, allBindings) {
var modelValue = valueAccessor()(),
checkedValue = allBindings.get('checkedValue'),
comparer = allBindings.get('checkedComparer');
element.checked = comparer(modelValue, checkedValue);
}
};
然後可以通過內容比較對象。
this.itemCompare = function(a, b) {
return JSON.stringify(a) == JSON.stringify(b);
}
的jsfiddle:http://jsfiddle.net/mbest/Q4LSQ/
如果這是真的,那麼我沒有看到checkedValue的點;第一個例子肯定會用'價值'來工作,我認爲第二個例子也是如此。 – Retsam
您可能對我添加的可以使用的自定義綁定感興趣,而不是'checked'並支持比較功能。 –