Javascript 当数组由对象组成时,敲除checkedValue绑定不起作用

Javascript 当数组由对象组成时,敲除checkedValue绑定不起作用,javascript,jquery,asp.net-mvc,knockout.js,Javascript,Jquery,Asp.net Mvc,Knockout.js,我的网站上有一个奇怪的页面问题。我正在使用ASP.NET MVC将模型数据发送到页面 我显示了一个基于Javascript数组中对象的复选框列表。当页面加载时,它会正确显示项目,但不会选择所选项目数组中的项目 下面是HTML的外观 <!-- ko foreach: items --> <p> <input type="checkbox" data-bind="checkedValue: $data, checke

我的网站上有一个奇怪的页面问题。我正在使用ASP.NET MVC将模型数据发送到页面

我显示了一个基于Javascript数组中对象的复选框列表。当页面加载时,它会正确显示项目,但不会选择所选项目数组中的项目

下面是HTML的外观

<!-- ko foreach: items -->
    <p>
        <input type="checkbox"
               data-bind="checkedValue: $data, checked: $root.selectedItems" />
        <span data-bind="text: Name"></span>
    </p>
<!-- /ko -->
var Item = function (id, name) {
    this.Id = id;
    this.Name = name;
};

var model = {
    items = ko.observableArray([]),
    selectedItems = ko.observableArray([])
};

@foreach (var serverItem in serverItems) {
    @:model.items.push(new Item('@serverItem.Id', '@serverItem.Name'));
}
@foreach (var selectedServerItem in selectedServerItems) {
    @:model.selectedItems.push(new Item('@selectedServerItem.Id', '@selectedServerItem.Name'));
}

ko.applyBindings(model);
您可能会认为它会被选中,因为对象是相同的,但事实并非如此。当我选中复选框时,它会向
selectedItems
数组中添加其他项,而不是使用现有项

['1', 'Business To Business'], ['2', 'Business To Consumer'], ['1', 'Business To Business']
有人能解释一下为什么会发生这种情况吗?为什么Knockout不理解复选框需要根据对象而不是原语进行检查

我最终得到的解决方案是:

var items = [];
@foreach (var serverItem in serverItems) {
    @:items[@serverItem.Id] = {Id: '@serverItem.Id', Name: '@serverItem.Name'};
    @:model.items.push(items[@serverItem.Id]);
    if (selectedServerItems.Any(si => si.Id == serverItems.Id)
        @:model.selectedItems.push(items[@serverItem.Id]);
}

现在,当页面加载时,复选框被正确选择。

对象是相同的,但它们是不同的实例。Knockout执行一个
=
(或者可能是
==
)来比较项目,在JavaScript中,对于一个对象的两个不同实例,即使它们在内部是相同的,也会始终返回false。不过,这对字符串很有效

var foo1 = {foo: 1};
var foo2 = {foo: 1};
var foo3 = foo1;

console.log(foo1 == foo2); // false
console.log(foo1 == foo3); // true

你可以看到,在这把小提琴中

哇。。。我真不敢相信事情竟如此简单。非常感谢。终于找到了我为什么会有同样的问题,太好了!为了更好地理解这一点,我还做了一个快速的jsfiddle: