我在使用Ember / Ember数据时遇到了一些错误。这是我的情景:
客户端登陆/
路由,Ember从/api/v1/videos?limit=8
加载数据。响应来自使用active_model_serializers的rails-api后端,可确保响应符合JSON API。现在商店已经加载了8个任意视频。
DOM中的每个视频组件都有一个指向用户页面的链接(视频belongsTo
用户和用户hasMany
视频)。
客户点击导致link-to
的{{1}},代表ID为1的用户
该路由的模型挂钩只加载单个用户记录。用户记录具有以下有效负载:
/users/1
问题是,ember不会自动发送{
"data": {
"id": "1",
"relationships": {
"videos": {
"data": [],
"links": {
"related": "/api/v1/videos?user_id=1"
}
},
},
"type": "users"
}
}
的请求(可能是因为类似的请求/api/v1/videos?user_id=1
已经发生)。
如果我直接加载/api/v1/videos?limit=8
页面,那么Ember很智能并自动加载来自/users/1
端点的数据。
我怀疑Ember被这样一个事实所迷惑,即对视频端点的类似请求已经发生了不同的查询参数。最终结果是我的应用程序没有在用户页面上显示任何数据。
解决此问题的一种方法是不使用链接/相关语法,而是使用视频ID填充/api/v1/videos?user_id=1
,这将导致ember发送n个n个视频请求。这适用于大型应用程序,但用户页面可能包含数百个视频。
我该如何解决这个问题?
您可以看到链接/相关结构的active_model_serializers设置应为tailored specifically for ember-data。
编辑:我尝试在active_model_serializers中使用include_data false
删除"data": [],
,但没有帮助。
编辑2:此处有data: []
的有效负载:
/api/v1/videos?limit=8
换句话说,该有效负载中的某些视频可能属于我们稍后加载的用户。
编辑3:我将此作为用户路线中的解决方法:
{
"data": [
...
{
"attributes": {
...
},
"id": "325",
"relationships": {
"user": {
"data": {
"id": "1",
"type": "users"
}
}
},
"type": "videos"
},
...
]
}
它有点愚蠢,但它现在已经完成了工作。
编辑4:我尝试升级到ember和ember-data v3。这种行为仍然存在。
答案 0 :(得分:0)
我用你的用例创建了一个Ember Twiddle。检查一下,找出与实施的差异。我很感兴趣,为什么它不适合你。我确定你错过了一些细节。
<强>更新强>
事实证明(见下面的评论),emberjs / data,如果提供了data-field(资源链接),则不会处理links.related-field
relationships: {
videos: {
data: [], // if data is provided(resource linkage), ember won't fetch relationships via links.related
links: {
related: "/videos?user_id=4"
}
}
}
我无法在JSON API DOC找到此限制,所以我认为这是特定于内容的,但这不应该是一个问题,因为数据:[]没有意义,如果链接-object被提供,因此序列化器应该省略它。
答案 1 :(得分:0)
@wuarmin提供的现有答案正确地将导致问题的现有资源链接(data: []
)标识为原因,但未解释发生了什么情况。听起来好像是Ember Data问题,但事实并非如此。
您的回复以两种形式包含有关相关数据的信息:
links.related
)和data: []
)。将空数组作为资源链接的值可为消费客户端提供两个信息和两个信息:
Ember Data从响应中已经知道没有任何相关记录,除非明确要求重新加载关系数据,否则它不会使用所提供的相关资源链接。
如果该资源有相关记录,则返回一个空数组作为资源链接是完全错误的。