2012-08-29 37 views
3

我已经得到了通过服务器发送了一些数据,格式如下:Knockout.js - 添加属性将数据发送服务器端

[ 
    {"Username":"[email protected]", "id":1}, 
    {"Username":"[email protected]", "id":2}, 
    {"Username":"[email protected]", "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,似乎有点愚蠢到让服务器发送通过线路在我的数据的每个项目。

发生基本上是这样的:http://jsfiddle.net/xSSMX/但不必添加每个项目的可观察Selected财产。

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

回答

1

你可以只使用映射到字段添加到您从这样的服务器获取阵列...

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

这将增加对每个项目选择。虽然如果我没有弄错地图在所有浏览器中都不支持,那么您必须添加支持,您可以使用与此处找到的功能类似的功能来进行支持...... http://www.tutorialspoint.com/javascript/array_map.htm。或者你可以使用jQuery的$.each达到相同的效果。

+0

我喜欢这个答案,因为我不需要改变我的数据,但是我对性能感到有点担心,并且在每个返回的项目中循环。这对于可能的数百个(可能高达1500个)项目来说足够高性能吗? –

+0

考虑到循环中实际上做得很少,它应该足够高性能。唯一的另一种选择是编辑/再现所有敲除绑定,以便在遇到不属于视图模型的属性时按照您希望的方式行事,也就是说,如果未找到该属性,则该属性为false,但如果需要将其设置为true,存在将其添加到视图模型。我可能会把今天晚些时候我的意思放在一起。 – MHollis

+0

嗯,好的谢谢。我可能会在'map'函数中做更多的事情(因为这只是一个例子的一小段代码),所以这就是我想知道的原因。到目前为止,我正在使用它,它的工作将与约200项。 –

0

当服务器发送数据时,您可以创建一个userModel(id, userName)。默认情况下,该模型将在false上有selected。我加入了一个jsFiddle来使这个更清晰一些。

http://jsfiddle.net/xSSMX/1/

+0

这将工作得很好,我只是不喜欢这样一个事实,即我不得不改变数据服务器端以适应我在UI中做的事情。 –

相关问题