2012-04-12 92 views
3

看看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

回答

4

這是映射插件的常見問題。目前沒有辦法用插件本身來做到這一點。一段時間以來一直困擾着我。該插件假定您給它的數組是數組的新內容,因此刪除了其他項目。

我目前知道的唯一的解決辦法是循環通過收集和手動映射每個元素。

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

總有一天我會找試圖拿出一個妥善的解決辦法,併發送pull請求映射插件傢伙。

希望這會有所幫助。