2012-07-28 36 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