如何使用带Knockout的Checked绑定将bool值绑定到单选按钮?

时间:2013-05-07 20:58:05

标签: knockout.js knockout-mapping-plugin

给定以下JSON对象,使用ko.mapping映射:

{ AllowNotifications: ko.observable(true) }

我想将一个bool值绑定到一个单选按钮,这样如果True为一个单选对象,则为False,然后检查另一个单位。

<input data-bind="checked: AllowNotifications" type="radio" name="allowNotifications" value="true"><label class="small positive" for="objectNotifications_true">Yes</label>
<input data-bind="checked: AllowNotifications" type="radio" name="allowNotifications" value="false"><label class="small negative" for="objectNotifications_false">No</label>

目前,虽然没有抛出任何错误,但这并没有正确绑定。为什么这不起作用?

1 个答案:

答案 0 :(得分:3)

绑定不起作用的原因是因为无线电的值“true”或“false”是一个字符串,而Knockout正试图绑定到文字的bool值。

一个合理的解决方法是指示Knockout将bool值true和false转换为字符串表示。为此,我们必须在将JSON映射到observables时提供一些说明:

例如:

var jsonData = { AllowNotifications: true };

var mapping = {
    'AllowNotifications': {
        create: function(options) { 
            return options.data ? 'true' : 'false';
        }
    }
};

viewModel = ko.mapping.fromJS(jsonData, mapping);

在上面的示例中,我们正在为AllowNotifications字段自定义ko.mapping的对象创建。

但是,如果我们有几个bool属性要转换,这将是多余和繁琐的,所以这是一个稍微更优雅的方法:

var jsonData = { AllowNotifications: true };

var boolToString = { create: function (options) { return options.data ? 'true' : 'false'; } };

var mapping = {
    'AllowNotifications': boolToString,
    'AnotherBoolProp': boolToString,
    'YetAnotherBoolProp': boolToString
};

var viewModel = ko.mapping.fromJS(jsonData, mapping);

KO文档中提供了详细信息: http://knockoutjs.com/documentation/plugins-mapping.html