Data binding 带有单选按钮的knockout.js布尔数据绑定问题

Data binding 带有单选按钮的knockout.js布尔数据绑定问题,data-binding,knockout.js,boolean,observable,Data Binding,Knockout.js,Boolean,Observable,我目前正在做以下工作,以补偿布尔值没有很好地映射到单选按钮。我一直在将1和0绑定到值(而不是true和false),因为字段是如何从可观察对象中读取的。Pref1/Pref2的值来自服务器,为真/假布尔值。这里的关键是,我不仅希望数据绑定单选按钮的选中值以匹配对象中的真/假,还希望布尔值真/假被写回GraduationClass对象。我的薪酬代码不仅难看,而且不可扩展 <input type="radio" value="1" name="radioGroup" data-bind="ch

我目前正在做以下工作,以补偿布尔值没有很好地映射到单选按钮。我一直在将1和0绑定到值(而不是true和false),因为字段是如何从可观察对象中读取的。Pref1/Pref2的值来自服务器,为真/假布尔值。这里的关键是,我不仅希望数据绑定单选按钮的选中值以匹配对象中的真/假,还希望布尔值真/假被写回GraduationClass对象。我的薪酬代码不仅难看,而且不可扩展

<input type="radio" value="1" name="radioGroup" data-bind="checked: Pref1" />Yes
<input type="radio" value="0" name="radioGroup" data-bind="checked: Pref2" />No    
<a href="javascript:void(0);" data-bind="click: $root.saveGraduationClass ">Save</a>  

function SiteSettingsViewModel() {
    var self = this;
    this.saveGraduationClass = function(graduationClass) {
        // hack until i get a custom radio button binding
        if (graduationClass.Pref1() == 1) {
            graduationClass.Pref1(true);            
        } else {
            graduationClass.Pref1(false);            
        }  

        if (graduationClass.Pref2() == 1) {
            graduationClass.Pref2(true);
        } else {
            graduationClass.Pref2(false);
        }

        // ...ajax call to save graduationClass to the server
    }

function GraduationClass(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);
}
是
不
函数SiteSettingsViewModel(){
var self=这个;
this.saveGraduationClass=函数(graduationClass){
//黑客,直到我得到一个自定义单选按钮绑定
if(graduationClass.Pref1()==1){
毕业班.Pref1(真);
}否则{
毕业班预科1(假);
}  
if(graduationClass.Pref2()==1){
毕业班。Pref2(真);
}否则{
毕业班预科2(假);
}
//…将graduationClass保存到服务器的ajax调用
}
函数刻度类(数据){
var self=这个;
fromJS(数据,{},this);
}

以下是knockoutJs网站的示例,演示了如何在 “选中”属性:

<p>Send me spam: <input type="checkbox" data-bind="checked: wantsSpam" /></p>
<div data-bind="visible: wantsSpam">
    Preferred flavor of spam:
    <div><input type="radio" name="flavorGroup" value="cherry" data-bind="checked: spamFlavor" /> Cherry</div>
    <div><input type="radio" name="flavorGroup" value="almond" data-bind="checked: spamFlavor" /> Almond</div>
    <div><input type="radio" name="flavorGroup" value="msg" data-bind="checked: spamFlavor" /> Monosodium Glutamate</div>
</div>

<script type="text/javascript">
    var viewModel = {
        wantsSpam: ko.observable(true),
        spamFlavor: ko.observable("almond") // Initially selects only the Almond radio button
    };

    // ... then later ...
    viewModel.spamFlavor("msg"); // Now only Monosodium Glutamate is checked
</script>
向我发送垃圾邮件:

垃圾邮件的首选口味: 樱桃 杏仁 味精 var viewModel={ WANTSPAM:ko.可观察(真), spamFlavor:ko.observable(“杏仁”)//最初仅选择杏仁单选按钮 }; //……后来。。。 viewModel.spamFlavor(“msg”);//现在只检查味精
但我不明白为什么在一个radiobutton组“radioGroup”中使用两个对象——“Pref1”和“Pref2”?在这种情况下,您可以使用一个对象,就像“spamFlavor”中使用的示例一样

所以,请更详细地描述您想要绑定的内容:一个单选按钮按一个选定值分组,或者其他内容


此外,您还可以使用计算的观测值来计算不同的值,请参见。

如果是“是/否”问题,将表单更改为使用复选框而不是单选按钮不是更容易吗?我想我可以,但理论上,我只是想看看如何解决这个问题。@Adamlevit-您可以编写一个扩展器来始终将Pref1/2的值转换为布尔值。但是我同意Niko的观点,这没有意义,并且与radi的方式相矛盾o按钮起作用。通常我同意复选框的建议,但a)有时你没有选择余地,因为你无法控制用户体验设计;或者b)有时故事还有更多的内容。下面是我最近研究的一个例子,其中单选按钮是一项要求,它们很有意义:
(o)使用计算出的估计值:123.50()提供一个覆盖:[[uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?