繁体   English   中英

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

[英]How to reload hasMany relationship in ember-data with ember octane?

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

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() function 是罪魁祸首,因为我们发现 .hasMany('editableContents').reload() 没有跳转到我们的应用程序适配器中的 findHasMany() 钩子,而是调用 findRecord()每条记录。

我们正在使用:

"ember-cli": "~3.21.2",
"ember-data": "~3.21.0"

任何帮助表示赞赏。 谢谢!

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

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

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()钩子,如果没有相关链接,则将相关链接设置为基本请求链接:

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
    }
  }
}

使用这种解决方法,它也使用一种相当老套的方法来查看链接是否是关系链接,the.reload() function 在我们的应用程序中再次全局工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM