敲除:阵列的部分映射

问题描述:

看看this small example敲除:阵列的部分映射

<select data-bind="options: Days, optionsText: 'title'"></select> 
<input type="button" value="update" data-bind="click: update" /> 

<script type="text/javascript"> 
var Days = {'Days': [{"id":1,"title":"Monday"},{"id":2,"title":"Tuesday"},{"id":3,"title":"Wensday"}]}; 

var DaysUpdate = {'Days': [{"id":3,"title":"Wednesday"},{"id":4,"title":"Thursday"},{"id":5,"title":"Friday"}]}; 

var mapping = {  
    'Days': {   
     key: function(data) {    
      return ko.utils.unwrapObservable(data.id);   
     }  
}} 

var viewModel = { 
    Days: ko.observableArray(), 
    update: function() { 
     ko.mapping.fromJS(DaysUpdate, mapping, viewModel); 
    } 
} 

ko.mapping.fromJS(Days, mapping, viewModel); 


ko.applyBindings(viewModel); 

</script> 

在这个例子中的数据被部分映射。先从Days对象开始,然后(通过单击更新按钮)从DaysUpdate对象中获取。第二次更新将删除阵列中的“星期一”和“星期二”对象。我如何让这些留下来?

PS。感谢Mark Robinson提供更好的结构化示例。

+0

这个小提琴演示你的问题。也许另一个SO用户可以使用它来提供解决方案。 http://jsfiddle.net/unklefolk/PfFf9/1/ – 2012-04-12 15:22:16

+0

太棒了!谢谢你的小提琴。我会在问题中提及它。 – Dziamid 2012-04-12 16:02:11

+0

@Dziamid - 我只是修正一个小错字在你的代码,又出现了“日”映射造成不被使用的密钥后的空间。但它不影响我的答案。 – madcapnmckay 2012-04-12 16:31:47

这是映射插件的常见问题。目前没有办法用插件本身来做到这一点。一段时间以来一直困扰着我。该插件假定您给它的数组是数组的新内容,因此删除了其他项目。

我目前知道的唯一的解决办法是循环通过收集和手动映射每个元素。

http://jsfiddle.net/madcapnmckay/5878E/

总有一天我会找试图拿出一个妥善的解决办法,并发送pull请求映射插件家伙。

希望这会有所帮助。