2012-03-11 10 views
7

Bir dizi nesneyi, eşleme eşleme eklentisiyle birlikte bir gözlemlenebilir Dizi ile eşleştirmeye çalışıyorum. Her nasılsa, bu hiç işe yaramıyor gibi görünüyor.Garip davranış eşleme dizisi ile gözlemlenebilir kanala ko.mapping.fromJS

ko.mapping.fromJS([ { x: 1, y: "test" } ]) 

returns: 
[] 

yanlış yapıyorum:

Sadece doğrulamak için Krom konsolu ile test? Aşağıdaki

ko.mapping.fromJS([ { x:1, y: "test" } ][0]) 

returns an object containing x and y as observables... 

çalışırsanız hepsi iyi çalışıyor. Tek fark, sadece bir nesne dizisi yerine tek bir nesne vermem. Ancak, eşleme eklentisinin belgelerini doğru olarak okursam, normal bir dizi dışında bir gözlemlenebilir Dizi oluşturmayı başarabilmelidir. Yardımlarınız için

sayesinde
Andreas

o (en azından teori/belgelerinde) yapıyor olması gerekenler
+7

emin olun: İşte

var bd = [ { x: 1, y: "bd test" }, { x: 2, y: "bd test 1dsf" } ]; var bdViewModel = ko.mapping.fromJS(bd); // 'bdViewModel' is NOT KO Observable Array, so you can't use KO Binding. However, all the properties of 'bdViewModel' (x and y) are KO Observable. //ko.applyBindings(bdViewModel, $("#bd").get(0)); console.log(bdViewModel()); // 'bdViewModel' must be called as function (with open and close parentheses) to see the data. $.each(bdViewModel(), function (i, d) { $("#bdList").append("<li>" + d.y() + "</li>"); }); 

JSBin haritalama JS dizisi ve JSON karşılaştırma için var GözlemlenebilirArray 'myObservableArray()' un unwrapped değerine bakıyorsunuz. Sadece gözlemlenebilir Array'ın kendisini yazdırırken yanıltıcı olabilir. –

+4

RP'nin belirttiği gibi ... sadece yanlış değere bakıyorsunuz. Doğrulamak için kullanabileceğiniz bir keman. Ko.mapping satırında bir kesme noktası ayarlayın ve şunu yazın: ko.mapping.fromJS (data) ve göreceksiniz []. Eğer ko.mapping.fromJS (data)() yazarsanız ve [Nesne, Nesne, Nesne, Nesne] 'yi görürsünüz. http://jsfiddle.net/jearles/y4b9e/8/ –

+1

Teşekkürler, Chrome, sadece boş bir diziyi gösteren [] yazdırıp beni kandırdı. Ama kesinlikle haklısınız, eğer ifadenin ardında parantezler varsa, içeriği tamamen gösterir. Yorum yazabilmek için çok çabuk! Stackoverflow kayalar ... – nttakr

cevap

1
ko.mapping.fromJS(data, {}, self.items); 
1

, ama görünüşe göre ne yaptığını değil. Ben aynı sorunu yaşıyorum ve ben başka çok inanıyoruz: https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

nesnesi olmalıdır:

{ "someName" : [ { x: 1, y: "test" } ] } 

senin nesne şema ile sopa için, KO ViewModel nesne eşleştirmek için ko.utils.arrayMap kullanabilirsiniz : http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html

function Item(name, category, price) { 
    this.name = ko.observable(name); 
    this.category = ko.observable(category); 
    this.price = ko.observable(price); 
    this.priceWithTax = ko.dependentObservable(function() { 
     return (this.price() * 1.05).toFixed(2); 
    }, this); 
} 

//do some basic mapping (without mapping plugin) 
var mappedData = ko.utils.arrayMap(dataFromServer, function(item) { 
    return new Item(item.name, item.category, item.price); 
}); 

DÜZENLEME ben th biraz daha araştırma yaptım

ve JS dizisi nesnesini KO eşleştirmesiyle eşleştirebilirsiniz, ancak harita sonrası nesnesi KO Gözlemlenebilir Dizisi DEĞİLDİR. O bu konuda KO ile şunları yapabilirsiniz veri bağlamak için, sadece düzenli JS dizi nesne olacak ve: Chrome'un konsolunda http://jsbin.com/uzuged/5/

+0

Benim durumumda çalışan eşleme eklentisini kullanmıyorum. Sunucudan bir dizi nesne alıyorum ve onu gözlemlenebilir bir diziye eşlemek istedim. Ben kullanılır: self.MyObservArray (ko.utils.arrayMap (arrayfromServer, işlev (öğe) { yeni BlogObject (öğe); })); – LKallipo