0

アプリのどこかで、サーバーが一度に多数のレコードを返します。Ember でこれを処理する方法は次のようなものです。

$.each(json["foos"], function(idx, val){
    DS.get('defaultStore').load(App.Foo, val)
});

アソシエーション以外は問題なく動作します。私が以下を持っている場合:

App.Dad = DS.Model.extend({
    sons: DS.hasMany('App.Son')
})

App.Son = DS.Model.extend({
    dad: DS.belongsTo('App.Dad')
})

コードで私が行う場合:

$.each(json["dads"], function(idx, val){
    DS.get('defaultStore').load(App.Dad, val)
});

$.each(json["sons"], function(idx, val){
    DS.get('defaultStore').load(App.Son, val)
});

次に、各息子は父親について「知っています」(私はできますa_son.get('dad'))が、父親は息子について知りません:a_dad.get('sons').get('length')0を返します。

その理由は、お父さんをロードしたときに、彼の息子がまだロードされていないためだと思います。しかし、これを機能させる方法はありますか?

次のように「手動で」実行できます。

$.each(json["sons"], function(idx, val){
    DS.get('defaultStore').load(App.Son, val);
    App.Dad.find(val.dad_id).get('sons').pushObject(App.Son.find(val.id));
});

しかし、これをしなければならないのは奇妙に思えます。

これを説明するために JSFiddle をまとめました: http://jsfiddle.net/eq8pB/1/

ありがとう!

PJ

4

2 に答える 2

0

「1 対多」の関係を作成する場合は、App.Dadクラスを再度開く必要があります。

App.Dad = DS.Model.extend({
    someProperties: (...)
});

App.Son = DS.Model.extend({
    dad: DS.belongsTo('App.Dad')
});

App.Dad.reopen({
    sons: DS.hasMany('App.Son')
});

ember-data testこれは、ember で関係がどのように機能するかを理解するための良い方法です。

于 2013-02-27T22:09:11.140 に答える
0

それが他の誰かを助ける場合: store.load が関連付けを構築するために、JSON で親と子の両方に対応するデータを渡す必要があります。つまり:

DS.get('defaultStore').load(App.Dad, {id: 1, name: "Dad"});
DS.get('defaultStore').load(App.Son, {id: 1, name: "Son", dad_id: 1});

// Dad of ID 1 will NOT know who his sons are. cf http://jsfiddle.net/eq8pB/1/
// Son of ID 1 will know who his dad is.

DS.get('defaultStore').load(App.Dad, {id: 1, name: "Dad", sons: [1]});
DS.get('defaultStore').load(App.Son, {id: 1, name: "Son", dad_id: 1});

// Dad of ID 1 WILL know who his sons are. cf http://jsfiddle.net/eq8pB/3/
// Son of ID 1 will know who his dad is.
于 2013-03-01T11:26:15.913 に答える