2012-04-12 10 views
3

Werfen Sie einen Blick auf this small example.Knockout: partielles Mapping von Arrays

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

In diesem Beispiel werden Daten teilweise abgebildet. Zuerst aus dem Days-Objekt, dann (durch Klicken auf Update-Schaltfläche) aus dem DaysUpdate-Objekt. Das zweite Update entfernt "Monday" und "Tuesday" Objekte aus dem Array. Wie mache ich diese bleiben?

PS. Danke an Mark Robinson für ein besser strukturiertes Beispiel.

+0

Diese Geige demonstriert Ihr Problem. Vielleicht kann ein anderer SO-Benutzer damit eine Lösung bereitstellen. http://jsfiddle.net/unklefolk/PfFf9/1/ –

+0

Großartig! Danke für die Geige. Ich werde es in der Frage beziehen. – Dziamid

+0

@Dziamid - Ich habe gerade einen kleinen Tippfehler in Ihrem Code korrigiert, nach dem 'Days'-Mapping gab es ein Leerzeichen, das dazu führte, dass der Schlüssel nicht verwendet wurde. Es beeinflusst meine Antwort jedoch nicht. – madcapnmckay

Antwort

4

Dies ist eine häufige Frage zum Mapping-Plugin. Derzeit gibt es keine Möglichkeit, dies mit dem Plugin selbst zu tun. Es nervte mich eine Weile. Das Plugin geht davon aus, dass das Array, das Sie ihm gegeben haben, der neue Inhalt des Arrays ist, entfernt also die anderen Elemente.

Die einzige Lösung, die ich derzeit kenne, besteht darin, die Sammlung zu durchlaufen und jedes Element manuell zuzuordnen.

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

Einer dieser Tage, die ich um eine angemessene Lösung zu kommen, bis zu versuchen, und senden Sie eine Pull-Anforderung an die Mapping-Plugin Jungs bekommen.

Hoffe, das hilft.

Verwandte Themen