首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ember octane重新加载ember-data中的hasMany关系?

如何用ember octane重新加载ember-data中的hasMany关系?
EN

Stack Overflow用户
提问于 2021-03-01 18:01:10
回答 1查看 168关注 0票数 2

从3.9升级到Ember3.21.2后,重新加载hasMany关系不再正常工作。例如,下面的为用户获取可编辑内容的model钩子不再更新用户模型。

代码语言:javascript
复制
model(params) {
    const { user } = this.modelFor('application')

    const requestParams = this.mapParams(params)

    return RSVP.hash({
      user,
      results: user.hasMany('editableContents').reload({
        adapterOptions: requestParams
      })
    })
  },

它仍然会触发请求,但它会为每个请求加载相同的内容,即使在请求参数更改之后也是如此。最初,请求被发送到/users/:user_id/editable-contents?filter=.....

更改适配器选项后,它会向/contents/:content_id发送对每个内容的请求

我们认为.reload()函数是罪魁祸首,因为我们发现.hasMany('editableContents').reload()不会跳转到应用程序适配器中的findHasMany()挂钩,而是为每个记录调用findRecord()。

我们使用的是:

代码语言:javascript
复制
"ember-cli": "~3.21.2",
"ember-data": "~3.21.0"

任何帮助都是非常感谢的。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-03-03 22:02:28

在Ember的Discord服务器上的用户sly7-7的帮助下,我们找到了正确的方向。

真正的问题是我们的有效负载缺少“相关”链接,因为分页的有效负载不包含该链接。在更改ember-data之前,缺少相关链接并不是问题,该更改实现了以下块,如果payload.links.related未定义,则该块将永远不会被调用:

代码语言:javascript
复制
if (payload.links) {
      let originalLinks = this.links;
      this.updateLinks(payload.links);
      if (payload.links.related) {
        let relatedLink = _normalizeLink(payload.links.related);
        let currentLink = originalLinks && originalLinks.related ? _normalizeLink(originalLinks.related) : null;
...
}

请参阅:https://github.com/emberjs/data/blob/ff4f9111fcfa7dd9e39804ed17f5af27a4a01378/packages/record-data/addon/-private/relationships/state/relationship.ts#L633

作为一种解决办法,我们覆盖了应用程序序列化程序中的normalizeArrayResponse()挂钩,如果没有相关链接,则将相关链接设置为基本请求链接:

代码语言:javascript
复制
normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
  if (payload.links && payload.links.first && !payload.links.related) {
    const baseLink = payload.links.first.split('?')[0]
    if (isRelationshipLink(baseLink)) {
      payload.links.related = baseLink
    }
  }
}

有了这个变通方法,.reload()函数就可以在我们的应用程序中全局地工作了。

为了安全起见,我们还将查看是否可以将相关链接与后端响应一起发送,这将比上面的解决方法更干净。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66420004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档