2

我目前正在执行以下操作以补偿布尔值不能很好地映射到单选按钮。由于字段是如何从 observables 中读取的,我被困在将 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);
}
4

1 回答 1

2

这是来自 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>

但我不明白你为什么使用两个对象 - 一个单选按钮组“radioGroup”的“Pref1”和“Pref2”?在这种情况下,您只需使用一个对象,例如使用“spamFlavor”的示例。

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

您也可以使用计算的 observables 来计算不同的值,请参见示例

于 2012-06-12T17:46:15.590 回答