Javascript 使用单选按钮的checkedValue绑定
我正试图利用knockout版本3中引入的checkedValue绑定,使用单选按钮,但没有得到我期望的行为 下面是一个示例:(viewModel有两个属性;Javascript 使用单选按钮的checkedValue绑定,javascript,knockout.js,Javascript,Knockout.js,我正试图利用knockout版本3中引入的checkedValue绑定,使用单选按钮,但没有得到我期望的行为 下面是一个示例:(viewModel有两个属性;list是一个数组;checkedVal是一个可观察的属性) 我希望单选按钮的行为正常,并且checkedVal是一个包含数据和索引的对象。checkedVal与我预期的一样,但是单选按钮没有选择。奇怪的是,在我的实际代码中,行为是不一致的;有时收音机管用,有时不管用,但就我所见,它在小提琴中总是不管用 这是一个bug,还是我误解了它
list
是一个数组;checkedVal
是一个可观察的属性)
我希望单选按钮的行为正常,并且checkedVal是一个包含数据和索引的对象。checkedVal与我预期的一样,但是单选按钮没有选择。奇怪的是,在我的实际代码中,行为是不一致的;有时收音机管用,有时不管用,但就我所见,它在小提琴中总是不管用
这是一个bug,还是我误解了它应该如何工作 您的
checkedValue
绑定成为一个函数,如下所示:
function () {
return {
data: $data,
index: $index(),
};
}
每次选中
绑定更新时,它都会调用此函数以获取值。但是函数总是返回一个新对象。即使对象包含相同的数据,Knockout也不会将它们视为相同的数据
您可以通过将值设置为字符串来解决此问题
<input type="radio" data-bind="
checkedValue: JSON.stringify({
data: $data,
index: $index(),
}),
checked: $parent.checkedVal
"/>
然后可以通过内容来比较对象
this.itemCompare = function(a, b) {
return JSON.stringify(a) == JSON.stringify(b);
}
jsFiddle:这个问题似乎已经在较新版本的KO中得到了解决。从3.2版开始,我不再看到我最初的问题中提到的这种行为
这是一个与原始版本相同的,除了KO更新为3.2。如果这是真的,那么我看不到checkedValue的意义;第一个示例当然只适用于“value”,我认为第二个也适用。您可能对我添加的自定义绑定感兴趣,它可以用来代替选中的
,
,并支持比较函数。
<input type="radio" data-bind="
checkedValue: $data,
checked: $parent.checkedVal
"/>
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);
}