Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用单选按钮的checkedValue绑定_Javascript_Knockout.js - Fatal编程技术网

Javascript 使用单选按钮的checkedValue绑定

Javascript 使用单选按钮的checkedValue绑定,javascript,knockout.js,Javascript,Knockout.js,我正试图利用knockout版本3中引入的checkedValue绑定,使用单选按钮,但没有得到我期望的行为 下面是一个示例:(viewModel有两个属性;list是一个数组;checkedVal是一个可观察的属性) 我希望单选按钮的行为正常,并且checkedVal是一个包含数据和索引的对象。checkedVal与我预期的一样,但是单选按钮没有选择。奇怪的是,在我的实际代码中,行为是不一致的;有时收音机管用,有时不管用,但就我所见,它在小提琴中总是不管用 这是一个bug,还是我误解了它

我正试图利用knockout版本3中引入的checkedValue绑定,使用单选按钮,但没有得到我期望的行为

下面是一个示例:(viewModel有两个属性;
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);
}