Mar*_*ska 10 ruby-on-rails ember.js ember-data active-model-serializers json-api
我在使用Ember/Ember数据时遇到了一些错误.这是我的情景:
客户登陆/路线,Ember从中加载数据/api/v1/videos?limit=8.响应来自使用active_model_serializers的rails-api后端,可确保响应符合JSON API.现在商店已经加载了8个任意视频.
DOM中的每个视频组件都有一个指向用户页面的链接(视频belongsTo是用户和用户hasMany视频).
客户点击link-to导航到/users/1哪个代表ID为1的用户
该路由的模型挂钩只加载单个用户记录.用户记录具有以下有效负载:
Run Code Online (Sandbox Code Playgroud){ "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被这样一个事实所迷惑,即对视频端点的类似请求已经发生了不同的查询参数.最终结果是我的应用程序没有在用户页面上显示任何数据.
解决此问题的一种方法是不使用链接/相关语法,而是填充"data": [],视频ID,这将导致ember发送n个视频的n个请求.这适用于大型应用程序,但用户页面可能包含数百个视频.
我怎样才能解决这个问题?
您可以看到,链接/相关结构的active_model_serializers设置应该专门为ember-data定制.
编辑:我试图摆脱data: []使用include_data falseactive_model_serializers没有帮助.
编辑2:这是有效载荷/api/v1/videos?limit=8:
{
"data": [
...
{
"attributes": {
...
},
"id": "325",
"relationships": {
"user": {
"data": {
"id": "1",
"type": "users"
}
}
},
"type": "videos"
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
换句话说,该有效负载中的某些视频可能属于我们稍后加载的用户.
编辑3:我这样做是用户路线中的一种解决方法:
afterModel(user) {
user.hasMany('videos').reload();
})
Run Code Online (Sandbox Code Playgroud)
这有点愚蠢,但它现在已经完成了工作.
编辑4:我尝试升级到ember和ember-data v3.这种行为仍然存在.
我用你的用例创建了一个Ember Twiddle 。检查一下以发现与您的实施的差异。我很感兴趣,为什么它对你不起作用。我确信您错过了一些小细节。
更新
事实证明(请参阅下面的评论),如果提供了 data-field(resource-linkage),那么 emberjs/data 不会处理 links.lated-field
relationships: {
videos: {
data: [], // if data is provided(resource linkage), ember won't fetch relationships via links.related
links: {
related: "/videos?user_id=4"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在JSON API DOC找不到这个限制,所以我认为这是特定于 ember 的,但这不应该是一个问题,因为 data: [] 没有意义,如果提供 links-object ,那么它应该是被序列化器省略。
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |