Ember.js:重新加载通过有效负载中的“链接”给出的 .hasMany 关系
Posted
技术标签:
【中文标题】Ember.js:重新加载通过有效负载中的“链接”给出的 .hasMany 关系【英文标题】:Ember.js: Reloading a .hasMany relationship given through "links" in payload 【发布时间】:2014-07-06 21:06:59 【问题描述】:假设我有两个模型,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 );
);
主题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 关系?非常感谢任何帮助。
【问题讨论】:
嗨@mike,我修好了坏掉的小提琴,请看看here 似乎与我之前的问题重复,对吧? How to reload an async with links hasMany relationship?的可能重复 查看相关github问题:github.com/emberjs/data/issues/2002 ***.com/questions/19983483/… 包含对您问题的回答 【参考方案1】:所以 GitHub 上有一个 issue 尚未关闭(截至今天):https://github.com/emberjs/data/issues/1913
我不知道如何让它重新加载,但我想我会分享我为解决此问题所做的解决方法。
我正在使用 websockets,所以每当创建新帖子时,我只需通过 websocket 发送它并使用数据来更新集合。
我知道这并不能解决 Ember Reload 的问题,但我想这对于已经在使用 Websockets / Socket.io 的人来说是一个不错的解决方案。
【讨论】:
【参考方案2】: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;
);
【讨论】:
以上是关于Ember.js:重新加载通过有效负载中的“链接”给出的 .hasMany 关系的主要内容,如果未能解决你的问题,请参考以下文章