2012-04-16 4 views
6

Es scheint, dass Knockout die Eigenschaften von Objekten in einem Array nicht korrekt abbildet.Knockout ordnet die Eigenschaften eines Objekts in einem Array nicht zu

Sehen Sie dieses Beispiel aus der Chromkonsole:

> var viewmodel = ko.mapping.fromJS({list:[]}); 
undefined 

> viewmodel.list().unshift({ name : ko.observable("Foo") }); 
1 

> viewmodel.list()[0].name(); 
"Foo" 

> var js = ko.mapping.toJS(viewmodel); 
undefined 

> js.list[0].name; 
undefined 

So ist die Javascript-Objekt erstellt wird, aber die Eigenschaft ‚Name‘ nicht zugeordnet bekommt.

Alle Ideen sind sehr willkommen!

Antwort

11

Von http://knockoutjs.com/documentation/plugins-mapping.html, über die toJS() Funktion:

Dies wird ein nicht zugeordnete Objekt enthält nur die Eigenschaften des abgebildeten Objekts erstellen, den Teil Ihres ursprünglichen JS Objekts waren.

Da "name" nicht Teil des ursprünglichen Objekts war, das Sie zugeordnet haben, wird es nicht zugeordnet. Sie müssen die Mapping-Plugin sagen, diese spezifische Eigenschaft enthalten:

var js = ko.mapping.toJS(viewmodel, { include: ['name'] }); 
+0

Danke für die schnelle Antwort. Gibt es eine Möglichkeit, das Verhalten zu ändern, um jede Eigenschaft zuzuordnen? Die Dokumentation scheint dies nicht zu erwähnen. –

+0

@RichardAstbury Ich glaube nicht. Sie müssen dies in einer angepassten Version des Mapping-Plugins fest codieren. – Niko

+2

Ich habe seitdem ko.toJSON (viewModel) gefunden, die den Job zu erledigen scheint. –

3

Obwohl Niko Antwort richtig ist - gibt es eine Möglichkeit, dieses Problem zu überwinden ..

Ich muss sagen, es ist ein bisschen von einem hässlichen hack, aber es macht den Job und es ist ziemlich einfach zu verstehen:

ko.mapping.toJS(ko.mapping.fromJSON(ko.toJSON(viewmodel))) 

ich die Ansicht Modell von beobachtbaren Karte zu beobachtbar JSon (mit allen Eigenschaften zugeordnet) zu widersprechen.

Verwandte Themen