我有以下Emberjs数据模型:
App.File = DS.Model.extend({
like: DS.attr('boolean'),
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
file: DS.belongsTo('App.File'),
comment: DS.attr('string')
});
并预加载:
App.store.load(App.File, {id: 1, like: false});
现在我想,如果我得到这样的评论:
var f = App.store.find(App.File, 1);
var c = f.get("comments");
var c是一个空的EmberArray,并向服务器发送一个请求。但我没有收到请求?为什么以及如何做?我真的不想预先加载评论。
此外,如果我添加了一个注释,但同时也更改了文件:
f.get("comments").createRecord({comment: "test"});
f.set("like", true);
App.store.commit();
向服务器发送两个请求。但是如果我返回以下JSON(对于文件):
{ "id": 1, like: true }
我的第一条可见评论再次消失。为什么?我该怎么办?
谢谢你的帮助!
关于问题的第一部分:您应该在文件的数据中填充注释ID:
App.store.load(App.File, {id: 1, like: false, comments: [1, 2, 3]});
因此,在需要时,注释将被延迟加载。
关于第二部分:您肯定不会序列化服务器回复上的注释ID,因此注释会重置,因为您描述的是一个空的注释列表。
您至少应该返回刚才显示的注释ID。。。这两个问题是联系在一起的。
答案的部分似乎是在适配器中使用DS.Adapter.findAssociation(...)
方法。然而,当从服务器再次加载父记录时,我遇到了与您相同的问题——所有子记录都会被删除。
我已经发布了我自己的问题,看看我是否能解决这个问题。如果这个问题得到了回答,它很可能也是你的答案。