Ember.js:重新加载通过有效负载中的“链接”给出的 .hasMany 关系

Posted

技术标签:

【中文标题】Ember.js:重新加载通过有效负载中的“链接”给出的 .hasMany 关系【英文标题】:Ember.js: Reloading a .hasMany relationship given through "links" in payload 【发布时间】:2014-07-06 21:06:59 【问题描述】:

假设我有两个模型,TopicPost

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 关系的主要内容,如果未能解决你的问题,请参考以下文章

延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类

Ember.js 路由器和 initialState 中的嵌套路由

ember.js 无限滚动(延迟加载)

Ember.js:如何加载音频文件

如何检查加载了哪个版本的Ember.js?

ember.js 和服务器