2012-03-11 67 views
7

ノックアウトマッピングプラグインを使用してobservableArrayにオブジェクトの配列をマップしようとしています。どういうわけか、これは私のために全く役に立たないようです。ko.mapping.fromJSを使用してobservableArrayに配列をマッピングする奇妙な動作

私はちょうど確認するために、クロームコンソールでテスト:

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

を確認してくださいobservableArray 'myObservableArray()'のラップされていない値を見ていることを確認してください。 observableArray自体を出力するだけでは、誤解を招く可能性があります。 –

+4

RPが述べたとおり、間違った価値を見ているだけです。あなたが確認するために使用できるバイブルはここにあります。 ko.mapping行にブレークポイントを設定し、ko.mapping.fromJS(data)と入力すると[]が表示されます。 ko.mapping.fromJS(data)()と入力すると、[Object、Object、Object、Object]が表示されます。 http://jsfiddle.net/jearles/y4b9e/8/ –

+1

ありがとう、 Chromeは空の配列を示す[]だけを印刷して私を騙しました。 しかし、私は表現の背後にある括弧の中身がすべて正しいことを示すなら、あなたは絶対に正しいです。 すぐにコメントをいただけると嬉しいです! – nttakr

答えて

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

。私は同じ問題を抱えていると私はあまりにも他の信じている:https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

オブジェクトでなければなりません:

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

オブジェクト・スキーマに固執するには、あなたはKOのViewModelにオブジェクトをマッピングするためにko.utils.arrayMapを使用することができます: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); 
}); 

EDIT

私は目の上のいくつかのより多くの研究をしました実際にJS配列オブジェクトをKOマッピングでマップすることはできますが、アフターマップオブジェクトはKO Observable Arrayではありません。それは普通の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>"); 
}); 

は、ここでマッピングJSの配列とJSONの比較のためにJSBinです:Chromeのコンソールでhttp://jsbin.com/uzuged/5/

+0

私の場合はマッピングプラグインを使用していませんでした。私はサーバーからオブジェクトの配列を取得し、それを観測可能な配列にマップしたいと考えました。私は使用しました:self.MyObservArray(ko.utils.arrayMap(arrayfromServer、function(item){ return new BlogObject(item); })); – LKallipo

関連する問題