2

私はBackboneを試していますが、少し問題が発生しました。

モデルの配列で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()を実行すると、これらのID値のない単純なオブジェクト(より有効な)が得られるため、解析が非常に困難になります。

このコレクションの投稿を解析できる唯一の方法は、次のようなことを行うことです。

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を避けますか?

4

1 に答える 1

1

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

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

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

このメソッドは、各モデル (接頭辞「c」) でcreate単一のモデルを解析 (およびcid/を検索) する便利なメソッドです。id

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

于 2012-05-06T20:31:55.603 に答える