2012-05-06 4 views
2

私はバックボーンを試していますが、少し問題があります。なぜバックボーンのcollection.createが配列をPOSTしないのか分かりません

モデルの配列でCollection.createを使用すると、サーバーに投稿されたJSONは解析が非常に簡単ではないようです。

例:

var Person = Backbone.Model.extend({ 
    initialize: function() { 
     this.on('all', function(e) 
       { console.log("Person model all " + this.get("name") + ", event: " + e); } 
      ); 
    } 
}); 

var People = Backbone.Collection.extend({ 
    initialize: function() { 
     this.on('all', function(e) { console.log("People collection event: " + e); }); 
    }, 
    url: "/models/", 
    model: Person 
}); 

var people = new People(); 
people.create([ { "name":"joe", "age":24 }, { "name":"dan", "age":42 } ]); 

私のサーバーは、次のJSONを受け取る:

これはのように、なぜそれありえない単純な配列である何
{"0":{"name":"joe","age":24},"1":{"name":"dan","age":42}} 

:それはあるので

[{"name":"joe","age":24},{"name":"dan","age":42}] 

、その非常に難しいのは、物事を悪化させる理由は、Model.save()を実行すると単純なオブジェクトを取得するということです有効である)。

私はこのコレクションポストを解析することができた唯一の方法は次のように何かをすることです。これは、なぜ

for(var n in payloadobj) 
{ 
    var person = new Object(); 
    person.id = parseInt(n, 10); 
    person.name = payloadobj[n].name; 
    person.age = payloadobj[n].age; 
} 

誰もが、私はちょうどにいくつかのものを上書きしようと思って、何かが足りないのです、知っていますより一貫性のあるものにするか、私は単にCollection.createを避けますか?

答えて

1

バックボーンのコレクションは内部で配列を使用しますが、順序付けされたモデルと順序付けられていないモデルへのアクセスを便利に提供することを目的としています。したがって、IDなしのPeopleインスタンスを追加すると、(別のIDを指定していないので)自動的にcid(clientId)プロパティが割り当てられます。

ただし、存在する場合、コードではCreateメソッドが呼び出されます。このメソッドは、一度に1つのモデル(配列ではありません)のみを使用します。だから、それは内部的に間違った構造を作り出しています。あなたはこれを行うことができます:

var people = new People([{ "name": "joe", "age": 24 }, { "name": "dan", "age": 42}]); 

create方法は、単一のモデルを解析し(とcid/idを探します)(「C」で始まる)各モデルにだけ便利なメソッドです。

したがって、独自の保存関数を作成すると、人物コレクションでtoJSONを呼び出すだけで、必要なもの(Personオブジェクトの配列)が得られます。

+0

この奇妙な構成は、a)サーバーがBackboneが使用した内部IDを気にせず、(b)証明するために、モデルを一度に作成すると、cidがポストされず、適切なJSONオブジェクトがポストされます。「作成する」オブジェクトに複数のオブジェクトを作成することは避けてください。 – Dan

+0

はい - 私はあなたのコードを誤読することに気付きました特に「作成」を呼び出してください)。だから、Backboneはあなたが望むものではない内部構造を作り出していました(それはCIDを作成していましたが、実際にはPersonオブジェクトを作成していませんでした)。私は私の答えを修正しました。 – WiredPrairie

関連する問題