Ember.js:通过有效载荷中的“链接”重新加载.hasMany关系
假设我有两个模型, 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 }); });
主题有多个post,一个postbelongsTo
一个主题。
要从API中加载数据,需要进行一次初始调用(例如,获取主题…主题ID 2): GET /topics/2
在接收到GET请求的有效载荷后,串行器将links
关键字附加到有效载荷上。 这有路线来加载与该主题相关的post:
"topic": { "id": 2, "links": { "posts": "/topics/2/posts" } }
这个第二个请求(到/topics/2/posts
)是这个post是如何加载并附加到这个主题的。
这一切工作正常,当第一次加载页面。
在页面会话期间创buildpost时发生此问题 。 虽然我可以让主题本身重新加载(通过在代表主题的模型对象上调用.reload()
),但与主题相关的Posts
不会被重新加载。 第二个API调用(获取post)从来没有做过,而第一个调用(只是得到的话题) 是做的。 如果我刷新页面,我在上一页加载创build的post将加载(但当然,如果我然后去做一些更多的post,他们将不会显示,直到下一页加载)。
寻找一个解决scheme,我碰到这个问题: 如何重新加载与链接的asynchronoushasMany关系?
但是,该解决scheme似乎不再适用于当前版本的Ember / Ember-Data。 提供的JSFiddle不起作用。
那么, 如何重新加载这种hasMany关系呢? 任何帮助是极大的赞赏。
所以在GitHub上还有一个问题还没有结束(截至今天): https : //github.com/emberjs/data/issues/1913
我不知道如何重新加载,但我想我会分享我解决这个问题的解决方法。
我正在使用websocket,所以当创build一个新的post时,我只是通过websocket发送它,并使用数据来更新集合。
我知道这不能解决与Ember重装的问题,但我想这是一个体面的解决scheme,已经使用Websockets / Socket.io的人。
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; }); }