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

如果它对其他人有帮助:对于 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 回答
0

如果你想建立一个“一对多”的关系,你必须重新开课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 回答