Ember:关系链接相关数据未加载/消失

Mar*_*ska 10 ruby-on-rails ember.js ember-data active-model-serializers json-api

我在使用Ember/Ember数据时遇到了一些错误.这是我的情景:

  1. 客户登陆/路线,Ember从中加载数据/api/v1/videos?limit=8.响应来自使用active_model_serializers的rails-api后端,可确保响应符合JSON API.现在商店已经加载了8个任意视频.

  2. DOM中的每个视频组件都有一个指向用户页面的链接(视频belongsTo是用户和用户hasMany视频).

  3. 客户点击link-to导航到/users/1哪个代表ID为1的用户

  4. 该路由的模型挂钩只加载单个用户记录.用户记录具有以下有效负载:

{
    "data": {
        "id": "1",
        "relationships": {
            "videos": {
                "data": [],
                "links": {
                    "related": "/api/v1/videos?user_id=1"
                }
            },
        },
        "type": "users"
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,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.这种行为仍然存在.

wua*_*min 1

我用你的用例创建了一个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 ,那么它应该是被序列化器省略。