Javascript Knockout.js-向服务器端发送的数据添加属性

Javascript Knockout.js-向服务器端发送的数据添加属性,javascript,json,knockout.js,Javascript,Json,Knockout.js,我通过服务器发送了一些数据,格式如下: [ {"Username":"user1@domain.com", "id":1}, {"Username":"user2@domain.com", "id":2}, {"Username":"user3@domain.com", "id":3} ] 我将其绑定到一个表,但我希望能够在选中复选框时向表行添加一个类(以指示它已被选中)。下面是最终会起作用的,我知道问题是,Selected当前不是我数据中的属性 <table>

我通过服务器发送了一些数据,格式如下:

[
  {"Username":"user1@domain.com", "id":1},
  {"Username":"user2@domain.com", "id":2},
  {"Username":"user3@domain.com", "id":3}
]
我将其绑定到一个表,但我希望能够在选中复选框时向表行添加一个类(以指示它已被选中)。下面是最终会起作用的,我知道问题是,
Selected
当前不是我数据中的属性

<table>
    <tbody data-bind="foreach: Items">
        <tr data-bind="css:{selected: Selected}">
            <td>
                <input type='checkbox' data-bind="attr:{name: id}, checked: Selected" />
            </td>
            <td data-bind="text: Username"> </td>
        </tr>
    </tbody>
</table>​
由于
Selected
的概念纯粹是用于UI的,因此让服务器通过网络为我的数据中的每个项目发送它似乎有点愚蠢

<table>
    <tbody data-bind="foreach: Items">
        <tr data-bind="css:{selected: Selected}">
            <td>
                <input type='checkbox' data-bind="attr:{name: id}, checked: Selected" />
            </td>
            <td data-bind="text: Username"> </td>
        </tr>
    </tbody>
</table>​
基本上,我希望这样做:但不必在每个项目上添加可观察的
Selected
属性


如何向数据中的每个现有项添加属性以实现此目的?

当服务器发送数据时,您可以创建一个
用户模型(id、用户名)
。默认情况下,此型号将在
false
上选择
。我包括了一个jsFiddle,以使这一点更加清楚


您可以使用map将字段添加到从服务器获取的数组中,如下所示

data = data.map(function(item) {
            item.Selected = ko.observable(false);
            return item;
        });

它将向每个项目添加选定项。虽然如果我没有弄错的话,map并不是在所有浏览器中都受支持的,所以您必须添加支持,您可以使用一个类似于此处的函数来实现这一点。或者使用jQuery的
$也可以达到同样的效果。每个

我喜欢这个答案,因为我不必更改数据,但我有点担心性能和循环返回的每个项目。这对于可能的100个(可能多达1500个)项目来说是否足够?考虑到在循环中实际完成的工作是多么少,它的性能应该足够。唯一的另一种选择是编辑/复制所有敲除绑定,以在遇到不在viewmodel上的属性时按照您希望的方式进行操作,也就是说,如果未找到该属性,则假定该属性为false,但如果需要将其设置为true且该属性不存在,则将其添加到视图模型中。今天晚些时候我可能会举一个例子来说明我的意思。嗯,好的,谢谢。我可能会在
map
函数中做更多的工作(因为这只是一个示例中的一小部分代码),所以这就是我想知道的原因。到目前为止,我正在使用它,它将处理大约200个项目。这将非常有效,我只是不喜欢这样一个事实,即我必须更改数据服务器端以适应我在UI中所做的事情的需要。