2015-07-11 49 views
1

我想呈現一個包含我的服務器發送給我的對象列表的表。目前,我正在這樣做:Knockout.js:更新加載映射插件的對象

<table> 
    <thead> 
    <tr> 
     <th>id</th> 
     <th>Name</th> 
     <th>Status</th> 
    </tr> 
    </thead> 
    <tbody data-bind="foreach: services"> 
    <tr> 
     <td data-bind="text: id"></td> 
     <td data-bind="text: name"></td> 
     <td data-bind="text: status"></td> 
    </tr> 
    </tbody> 
</table> 

而且Knockout.js結合部分:

var mappedData = komapping.fromJSON('{{{ services }}}'); 
ko.applyBindings({services: mappedData}); 

services是包含JSON數據與整個頁面呈現與車把的變量。 目前爲止這麼好。我能夠呈現表格中收到的數據。

現在的問題:我想收到一個通知,告訴我服務的狀態已經改變,並更新mappedData中的相應對象。 問題是mappedData看起來很不透明,我無法檢索一個對象並更新它,因爲它的ID爲

幫助感謝!

+0

狀態如何更新? –

回答

0

在這一點上你mappedData變量將是淘汰賽陣列和一幫包含淘汰賽觀測對象。

因此,您所要做的就是將正確對象中的狀態observable從數組中更改。

function updateServiceStatus(id, status) { 
    var service = mappedData().filter(function(e) { return e.id() == id; }); 
    if (service.length) { 
     service[0].status(status); 
    } 
} 
+0

感謝理查德,這工作。我不確定爲什麼我必須在我過濾它之前調用'mappedData()'對象。 KO文檔在這個話題上似乎有點薄弱。 –

+0

http://knockoutjs.com/documentation/observableArrays.html - 它包含所有可以直接調用observableArray的屬性的列表。過濾器不是其中之一,因爲結果可能會根據數組內容而改變(所以,例如,它不會更新計算)。你需要調用'mappedData()'來解析observable的數組值,然後在普通的JS數組上調用'filter(...)'。 –

0

要獲得該對象,您可以編寫一個幫助函數來爲您檢索服務對象。你可以做這樣的事情(假設mappedData是observableArray和id觀察到的):

function get_service_by_id(service_id){ 
    for(var i=0;i<mappedData().length;i++){ 
     if (mappedData()[i].id() === service_id){ 
      return mappedData()[i]; 
     } 
    } 
    return false; 
} 
+0

嗨Bogdig,謝謝你的回覆。儘管我喜歡理查德提供的語法,但您的解決方案仍然有效。 –