从3.9升级到Ember3.21.2后,重新加载hasMany关系不再正常工作。例如,下面的为用户获取可编辑内容的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()函数是罪魁祸首,因为我们发现.hasMany('editableContents').reload()不会跳转到应用程序适配器中的findHasMany()挂钩,而是为每个记录调用findRecord()。
我们使用的是:
"ember-cli": "~3.21.2",
"ember-data": "~3.21.0"任何帮助都是非常感谢的。谢谢!
发布于 2021-03-03 22:02:28
在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;
...
}作为一种解决办法,我们覆盖了应用程序序列化程序中的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
}
}
}有了这个变通方法,.reload()函数就可以在我们的应用程序中全局地工作了。
为了安全起见,我们还将查看是否可以将相关链接与后端响应一起发送,这将比上面的解决方法更干净。
https://stackoverflow.com/questions/66420004
复制相似问题