2012-07-28 34 views
2

我嘗試使用映射插件作爲observableArray的一部分更新項目時遇到問題。敲出映射插件更新數組中的單個項目

我有以下代碼

accounts.list = ko.mapping.fromJS(@(Html.Raw(Model.AccountsJSON))); 

我有這樣的綁定到表使用

<tbody data-bind="foreach: list"> ... </tbody> 

這一切工作正常,我那麼有以下功能

$('#datatable').delegate(".cancelLock", "click", function() { 
     var item = ko.contextFor(this).$data; 
     var param = {AccountNumber : item.AccountNumber()} 
     $.post('@Url.Action("cancellock","accounts")',param,function(result){ 
      ko.mapping.fromJSON(result,item); 
      if(accounts.lockeditem() == item){ 
       accounts.lockeditem(0); 
      } 
     }); 
    }); 

的行ko.mapping.fromJSON(result,item);導致沒有錯誤,並且功能繼續,但它不會導致可觀察的更新。

我試着將代碼更改爲ko.mapping.fromJSON(result,accounts.list);(並更新我的控制器以返回完整列表),並且這個工作正常 - 問題是我不想更新整個表,我「簡單地」想要將'item'恢復到原始狀態。

我也嘗試過使用item.Updated(result.Updated);(其中updated是對象的屬性之一),並按預期工作,但我寧願不手動在每個屬性上手動調用它,除非必須。

是否可以使用ko.mapping.fromJSON(result,item);(或某些變體)?我在做一些愚蠢的錯誤?

在此先感謝。

回答

4

除非我誤解了您的意圖,否則您可以使用ko.mapping.fromJS(或fromJSON)的變體(在mapping docs中的「指定更新目標」下提及)進行此操作。 所以我想你想的:

ko.mapping.fromJSON(result, {}, item); 

這裏有一個小提琴:http://jsfiddle.net/kR4jc/

+1

謝謝 - 相信與否我之前曾嘗試過 - 好像我可能遇到了影響它的問題 – 2012-07-31 09:07:26