2012-08-29 43 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中做的事情。 –

相關問題