1

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

{ AllowNotifications: ko.observable(true) }

我想将一个布尔值绑定到一个单选按钮,以便如果 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>

目前,尽管没有引发错误,但这并没有正确绑定。为什么这不起作用?

4

1 回答 1

3

绑定不起作用的原因是收音机的值“true”或“false”是一个字符串,并且 Knockout 正在尝试绑定到文字 bool 值。

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

例如:

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

于 2013-05-07T21:09:11.080 回答