2013-01-21 75 views
0

我無法從從服務器加載的對象數組中更新列。未能重新評估綁定到錶行的屬性knockout.js-style

我有這樣的事情:

self.tenants = ko.observableArray([{"Id":1,"Name":"Tenant 1","IsActive":true}]); 
self.selectedTenant = ko.observable(null); 

UI:

<tbody data-bind="foreach: tenants"> 
    <tr data-bind="css: { 'active-row': $root.selectedTenant() === $data }"> 
    <td><a href="#" data-bind="click: $root.select">Select</a></td> 
    <td data-bind="text: Name"></td> 
    <td data-bind="text: Count"></td> 
    <td></td> 
    <td></td> 
    <td data-bind="text: IsActive"></td> 
    </tr> 
</tbody> 

現在我想確保用戶界面顯示出來,當我設置爲IsActivefalse

我知道理想的IsActive是可觀察的,但由於我直接從服務器獲得數組,所以我不知道我該怎麼做。

其次我想方設法去淘汰賽重新評估數組。

我嘗試了好幾種方案,其中之一是這樣的:

var selected = self.selectedTenant(); 
selected.IsActive = true; 
var idx = self.tenants.indexOf(selected); 
//self.tenants.remove(selected); 
var newArray = self.tenants().splice(idx, 1, selected); 
self.tenants(newArray); 
//self.tenants.valueHasMutated(); 

但是這一切似乎是徒勞,列始終顯示原始值。我錯在哪裏,或者我應該怎麼做?

回答

1

您需要將您的服務器數據TenantViewModels這就是利用觀測手動或與柯映射插件

如果你正在做手工,你可以使用ko.utils.arrayMap功能在每個元素地圖數組從服務器到TenantViewModels的新陣列