假设我有两个模型,Topic
和Post
App.Topic = DS.Model.extend({
posts: DS.hasMany('post', { async: true, inverse: 'post' });
});
App.Post = DS.Model.extend({
topic: DS.belongsTo('topic', { async: true });
});
Topic hasMany
帖子和belongsTo
帖子主题。
要从API加载数据,需要进行一个初始调用(获取一个主题...主题ID 2为例):GET /topics/2
收到此GET请求的有效负载后,序列化程序随后将一个links
键附加到该有效负载。这具有加载与该主题相关联的帖子的路由:
"topic": {
"id": 2,
"links": {
"posts": "/topics/2/posts"
}
}
第二个请求(对/topics/2/posts
)是如何加载帖子并将其附加到主题。
当第一次加载页面时,这一切都运行得很好。
在页面会话期间创建帖子时,会出现此问题。虽然我可以让主题本身重新加载(通过在表示主题的模型对象上调用.reload()
),但与主题关联的Posts
是而不是重新加载的。第二个API调用(用于获取帖子)甚至从未进行过,而第一个调用(仅用于获取主题)。如果我刷新页面,我在上一次加载页面时创建的帖子将会加载(当然,如果我随后再发一些帖子,它们直到下一次页面加载时才会显示出来)。
在寻找解决方案时,我遇到了这个问题:How to reload an async with links hasMany relationship?
然而,该解决方案似乎不再适用于当前版本的Ember/Ember-Data。提供的JSFiddle无法正常工作。
那么,我怎样才能重新加载这种hasMany关系呢?任何帮助都非常感谢。
发布于 2015-03-25 17:20:37
DS.Model.reopen({
reloadLink: function (linkKey) {
if ($.isArray(linkKey)) {
var promises = [];
for (var i = 0; i < linkKey.length; i++) {
promises.push(this.reloadLink(linkKey[i]));
}
return Em.RSVP.all(promises);
} else {
var rel = this._relationships[linkKey];
if (rel) {
if (rel.reload) {
return rel.reload();
} else if (rel.fetchLink) {
return rel.fetchLink();
}
}
}
}
});
示例:
model: function () {
var model = this.modelFor('_some_model_');
return model.reloadLink(['link1', 'link2']).then(function () {
return model;
});
}
发布于 2014-11-24 23:34:26
所以在GitHub上有一个问题(到今天为止)还没有结束:https://github.com/emberjs/data/issues/1913
我不知道如何让它重新加载,但我想我会分享我为解决这个问题所做的变通方法。
我使用的是websockets,所以每当创建新的帖子时,我只需通过websocket发送它,并使用数据来更新集合。
我知道这并不能解决Ember重新加载的问题,但我想对于已经在使用Websockets / Socket.io的人来说,这是一个不错的解决方案。
https://stackoverflow.com/questions/23728708
复制相似问题