Javascript Ember.js:重新加载一个.hasMany关系通过";链接“;有效载荷中

Javascript Ember.js:重新加载一个.hasMany关系通过";链接“;有效载荷中,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,假设我有两个模型,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有许多帖子,一篇帖子属于一个主题 要从API加载数据,需要进行一次初始调用(例如获取一

假设我有两个模型,
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
有许多帖子,一篇帖子
属于一个主题

要从API加载数据,需要进行一次初始调用(例如获取一个主题…主题ID 2):
GET/topics/2

在收到此GET请求的有效负载后,序列化程序然后向有效负载附加一个
links
键。这具有加载与主题关联的帖子的路径:

"topic": {
   "id": 2,
   "links": {
      "posts": "/topics/2/posts"
   }
}
第二个请求(到
/topics/2/posts
)是如何加载帖子并将其附加到主题

当第一次加载页面时,这一切都可以正常工作

在页面会话期间创建帖子时会出现问题。虽然我可以让主题本身重新加载(通过对表示主题的模型对象调用
.reload()
),但与主题关联的
帖子不会重新加载。第二个API调用(获取帖子)从未进行过,而第一个API调用(仅获取主题)从未进行过。如果我刷新页面,我在上一次页面加载时创建的帖子将被加载(当然,如果我再去写一些帖子,它们在下一次页面加载之前不会显示)

在寻找解决方案时,我遇到了以下问题:

但是,该解决方案似乎不再适用于当前版本的余烬/余烬数据。提供的JSFIDLE不起作用


因此,如何重新加载此类hasMany关系?非常感谢您的帮助。

因此,GitHub上有一个问题(截至今天)尚未解决:

我不知道如何让它重新加载,但我想我会分享解决这个问题的方法

我使用的是websocket,所以每当创建一篇新文章时,我都会通过websocket发送它,并使用数据更新收集


我知道这并不能解决Ember重新加载的问题,但我想对于已经使用WebSocket/Socket.io的用户来说,这是一个不错的解决方案。

Hi@mike,我修复了坏掉的小提琴,请给我一个看起来像是重复我以前的问题对吗?可能重复的检查相关的github问题:包含您的问题的答案
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;
    });
}