Javascript Knockout js:绑定对象而不是单个值的代码

Javascript Knockout js:绑定对象而不是单个值的代码,javascript,knockout.js,Javascript,Knockout.js,这会在列表的每个项目旁边放置一个复选框,在该复选框中,更改选中状态会从SelectedItems数组中添加/删除该值: <script type="text/x-jquery-tmpl" id="tmpl"> <input name="cSelect" type="checkbox" value="${ ID }" data-bind="checked: VM.SelectedItems" />

这会在列表的每个项目旁边放置一个复选框,在该复选框中,更改选中状态会从SelectedItems数组中添加/删除该值:

<script type="text/x-jquery-tmpl" id="tmpl">
    <input name="cSelect" 
           type="checkbox"
           value="${ ID }"
           data-bind="checked: VM.SelectedItems" />
    <!-- Add other item content here -->
</script>

VM.SelectedItems = ko.observeableArray([]);

VM.SelectedItems=ko.observeableArray([]);
在任何时候,SelectedItems都包含选中项目的ID


如果我想让复选框添加和删除SelectedItems的对象,该怎么办?例如,我想存储一个实际对象
{id:3,checked:true}
,而不是将其序列化为value属性?

在对数组使用
checked
绑定时,它只适用于一组基本体

一个选项是创建一个计算的可观察对象,该对象根据所选ID构建对象数组

var ViewModel = function() {
    var self = this;
    this.items = [{id: 1, name: "one"}, {id: 2, name: "two"}, {id: 3, name: "three"}];
    this.selectedIds = ko.observableArray();
    this.selectedItems = ko.computed(function() {
        return ko.utils.arrayMap(self.selectedIds(), function(id) {
            return ko.utils.arrayFirst(self.items, function(item) {
                return item.id == id; //selected id will be a string
            }); 
        });
    });                                                           
};

ko.applyBindings(new ViewModel());
如果要处理大量项,则可能需要构建一个对象,该对象是项的索引(按键),这样就可以在选定的EDID中循环,并直接获取每个对象以减少循环量

下面是一个示例:

我们可以使用

<input type="checkbox" data-bind="attr: {value: JSON.parse($data).Id}, checked: $root.selectedIds"/>

并在复选框中写入一个单击事件,以获取SelectedDS的选定数据或订阅方法,并将选定id的完整详细信息作为JSON获取,我们必须使用JSON.parse来获取数据


但是我不知道如何在没有JSON的情况下存储整个对象。

对于KnockoutJS 3.0.0,您可以使用
checkedValue
参数:

<input name="cSelect" type="checkbox" value="${ ID }" data-bind="checkedValue: $data, checked: VM.SelectedItems" />

如果绑定还包括checkedValue,则这将定义该值 由选中的绑定而不是元素的value属性使用。 如果您希望值不是 字符串(例如整数或对象),或者您希望设置值 动态地


有关更多详细信息,请参见

“对数组使用选中绑定时,它仅适用于原语数组。”这是一条重要信息,应包含在淘汰文档中。