Ember/Ember-data遇到了一些问题。以下是我的场景:
1.客户端登陆到/
路由,Ember从/api/v1/videos?limit=8
加载数据。响应来自使用active_model_serializers的rails-api后端,这确保了响应符合JSON API。现在商店有8个任意视频加载到其中。
- DOM中的每个视频组件都有一个到用户页面的链接(视频
belongsTo
用户和用户hasMany
视频)。
1.客户端单击link-to
,导航到表示ID为1的用户的/users/1
1.该路由的模型钩子只加载一个用户记录。
{
"data": {
"id": "1",
"relationships": {
"videos": {
"data": [],
"links": {
"related": "/api/v1/videos?user_id=1"
}
},
},
"type": "users"
}
}
问题是ember不会自动发送/api/v1/videos?user_id=1
的请求(可能是因为类似的请求/api/v1/videos?limit=8
已经发生了)。
如果我直接加载/users/1
页面,Ember会自动从/api/v1/videos?user_id=1
端点加载数据。
我怀疑Ember是被这样一个事实所欺骗了,即已经用不同的查询参数向视频端点发出了类似的请求。最终结果是我的应用在用户页面上没有显示任何数据。
解决这个问题的一个方法是不使用链接/相关语法,而是用视频ID填充"data": [],
,这将导致ember发送n个请求,以获得n个视频。这是可行的,但对于一个用户页面可能有数百个视频的大规模应用来说是不可接受的。
我该如何解决这个问题?
您可以看到,链接/相关结构的active_model_serializers设置应该是专门为ember-data定制的。
编辑:我尝试在active_model_serializer中使用include_data false
来摆脱data: []
,但没有帮助。
编辑2:/api/v1/videos?limit=8
的有效负载如下:
{
"data": [
...
{
"attributes": {
...
},
"id": "325",
"relationships": {
"user": {
"data": {
"id": "1",
"type": "users"
}
}
},
"type": "videos"
},
...
]
}
换句话说,该有效载荷中的一些视频 * 可能 * 属于我们稍后将加载的用户。
编辑3:我这样做是作为用户路由中的一个变通方法:
afterModel(user) {
user.hasMany('videos').reload();
})
这是一种愚蠢的,但它得到的工作完成现在。
编辑4:我试过升级到ember和ember-data v3,但问题仍然存在。
2条答案
按热度按时间6tdlim6h1#
我用你的用例创建了一个Ember Twiddle。检查一下它,找出与你的实现的不同之处。我很感兴趣,为什么它不适合你。我相信你错过了一些小细节。
更新
事实证明(见下面的注解),emberjs/data,不处理链接。related-field if data-field(资源链接)被提供
我在JSON API DOC中找不到这个限制,所以我认为这是ember特定的,但这不应该是一个问题,因为数据:如果提供了links-object,则[]没有意义,因此序列化程序应将其省略。
dw1jzc5e2#
@wuarmin提供的现有答案正确地将现有资源链接(
data: []
)识别为导致问题的原因,但没有解释发生了什么。听起来好像是Ember Data问题,但实际上不是。您的回复包括两种形式的相关数据信息:
1.作为相关资源链接(
links.related
)和1.使用资源链接(
data: []
)。将空数组作为资源链接的值提供了两个信息两个信息给消费客户端:
1.这是一种拥有很多人的关系。
1.没有任何相关记录。
由于Ember Data已经从响应中知道没有任何相关记录,因此它不会使用提供的相关资源链接,除非明确告知重新加载关系数据。
如果存在该资源的相关记录,则返回空数组作为资源链接是完全错误的。