2012-03-11 65 views
7

我想映射的對象數組到一個observableArray與挖空映射插件。 不知何故,這似乎不適合我。奇怪的行爲映射數組到observableArray與ko.mapping.fromJS

我只是克羅姆控制檯進行測試,以驗證:

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

returns: 
[] 

我在做什麼錯? 如果我嘗試以下方法

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

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

它一切正常。唯一的區別是我只提供一個對象而不是一個對象數組。但是,如果我正確地閱讀了映射插件的文檔,它應該能夠處理從普通數組中創建observableArray。

感謝您的幫助,
安德烈亞斯

+7

在Chrome的控制檯確保您正在查看observableArray'myObservableArray()'的解包值。打印出observableArray本身時可能會產生誤導。 – 2012-03-11 17:52:11

+4

正如RP所說......你只是看着錯誤的價值。這裏有一個你可以用來驗證的小提琴。在ko.mapping行設置一個斷點並輸入:ko.mapping.fromJS(data),你會看到[]。如果輸入:ko.mapping.fromJS(data)()並且您看到[Object,Object,Object,Object]。 http://jsfiddle.net/jearles/y4b9e/8/ – 2012-03-11 18:11:37

+1

謝謝你們, Chrome通過打印指示空陣列的[]指示我。 但是你是絕對正確的,如果我只是在表達後面的大括號,它顯示的內容好吧。 很快就能收到評論! Stackoverflow的岩石... – nttakr 2012-03-11 23:53:47

回答

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

就是這樣應該做什麼(至少在理論上/文檔),但顯然這不是它在做什麼。我有同樣的問題,我相信等過:https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

的對象必須是:

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

當您對象模式堅持,你可以使用ko.utils.arrayMap到對象映射到您的KO視圖模型: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); 
}); 

編輯

我做了個一些調查研究是的,你實際上可以用KO映射映射JS數組對象,但是,映射後對象不會是KO可觀察數組。這將是隻是普通的JS數組對象和,對於這個問題,你可以將數據綁定與KO:

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映射JS數組和JSON的比較:http://jsbin.com/uzuged/5/

+0

不使用映射插件工作在我的情況。我從服務器獲取一個對象數組,並希望將其映射到可觀察數組。我使用:self.MyObservArray(ko.utils.arrayMap(arrayfromServer,function(item){ )return new BlogObject(item); })); – LKallipo 2013-10-08 13:37:05