checkbox非布尔值?

时间:2012-04-10 19:13:26

标签: knockout.js

我有以下示例: http://jsfiddle.net/jLkxG/6/

is_checked属性可以有2个值:Yes或No.如果值为yes,则应选中该复选框,单击保存的链接时,应根据是否选中复选框为属性分配yes或no。

你会如何在knockoutjs中做到这一点?

2 个答案:

答案 0 :(得分:3)

你的第一个问题是你错过了绑定的括号:

<input type="checkbox" value="Yes" data-bind="checked: is_checked() == 'Yes'"/>

现在可以在加载时正确检查复选框。

更大的问题是单击复选框不会将值写回。如果你将is_checked()更改为bool,它将正常工作。所以如果你有:

 self.is_checked = ko.observable(true);

data-bind="checked: is_checked"

它会起作用。取消选中该框将更新is_checked的值。如果你真的很重要的是它是Yes / No而不是True / False那么你将不得不编写一些代码来将真/假检查状态转换为是/否。你可以通过几种方式解决这个问题。我会尝试一个计算的observable。见这里:http://jsfiddle.net/jLkxG/7/

答案 1 :(得分:3)

除了计算之外的另一种方法是使用“subscribe”来监听值的变化。例如,绑定到is_checked并使该值为true或false。然后订阅该observable并根据需要将另一个属性设置为Yes / No.请看这里的小提琴:http://jsfiddle.net/johnpapa/jLkxG/8/

HTML

<input type="checkbox" data-bind="checked: checkedvals.is_checked"/>
<label>Test</label><br/>

<pre data-bind="text:displayJS">
</pre>​

的JavaScript

var viewModel = (function() {
    var self = this;
    self.checkedvals = {
        is_checked : ko.observable(true),
        is_checked_val : ko.observable("Yes")
    };
    self.checkedvals.is_checked.subscribe(function(){
        self.checkedvals.is_checked_val(self.checkedvals.is_checked() ? "Yes" : "No");
    });

    self.displayJS = ko.computed(function() {
        return JSON.stringify(ko.toJS(checkedvals), null, 2);
    });
})();
ko.applyBindings(viewModel);​