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

Posted

技术标签:

【中文标题】Ember:关系链接相关数据未加载/消失【英文标题】:Ember: Relationship link related data not loading / disappearing 【发布时间】:2018-07-05 04:29:12 【问题描述】:

我在使用 Ember/Ember-data 时遇到了一些错误。这是我的场景:

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

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

    客户端点击link-to,该/users/1代表ID为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 设置应该是tailored specifically for ember-data。


编辑:我尝试在 active_model_serializers 中使用 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。行为仍然存在。

【问题讨论】:

请显示/api/v1/videos?limit=8的有效载荷 我在我这边测试了你的例子,你的用例对我有用。所以它不是 emberjs/data 错误。请检查您指向用户/显示页面的链接。如果您从 videos-index 切换到 users/show,请检查您的 users/show-model 钩子是否被调用。 @Lux @wuarmin 我更新了/api/v1/videos?limit=8的有效载荷。我仍然有这个问题。 此响应是否包含 included 属性中的任何内容? /api/v1/videos?limit=8 响应?它没有。 【参考方案1】:

@wuarmin 提供的现有答案正确地将现有资源链接 (data: []) 识别为导致问题的原因,但没有解释发生了什么。听起来好像是 Ember Data 问题,但事实并非如此。

您的回复包括两种形式的相关数据信息:

    作为相关资源链接 (links.related) 和 使用资源链接 (data: [])。

将一个空数组作为资源链接的值向消费客户端提供两个信息两个信息:

    这是一种多方关系。 没有相关记录。

由于 Ember Data 已经从响应中知道没有任何相关记录,它不会使用提供的相关资源链接,除非明确告知重新加载关系数据。

如果该资源有相关记录,则返回一个空数组作为资源链接是完全错误的。

【讨论】:

【参考方案2】:

我用你的用例创建了一个Ember Twiddle。检查它以找出与您的实施的差异。我很感兴趣,为什么它对你不起作用。我确定这是您遗漏的一些小细节。


更新

事实证明(见下面的 cmets),如果提供了 data-field(resource-linkage),则 emberjs/data 不处理 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 找不到这个限制,所以我认为这是特定于 ember 的,但这应该不是问题,因为 data: [] 没有意义,如果提供了 links-object,所以它应该被序列化程序省略。


【讨论】:

感谢您撰写本文。您的测试代码缺少一个细节(这可能是问题的原因):每个用户有效负载都应该有data: [],,因为这似乎是active_model_serializers 强制它的方式。 不客气。你得到一个数组作为 findRecord 的主要数据?即: "data": [ "type": "users", "id": "1", "attributes": ] 。如果我这样做,我会收到以下错误:Ember Data 期望从“findRecord”响应返回的主要数据是一个对象,但它找到了一个数组 该数组位于"relationships" 结构内,这似乎表示一个空的视频数组。这与我最初问题中的代码 sn-p 相同。 啊,是的,就是这个原因!检查您是否可以更改您的序列化程序代码。 include_data false 成功了:github.com/rails-api/active_model_serializers/pull/1454

以上是关于Ember:关系链接相关数据未加载/消失的主要内容,如果未能解决你的问题,请参考以下文章

Ember:访问模板中的侧载模型关系数据

Ember文档理解 - 模板是否链接到模板?

实体关系图 - 3 个未链接的表

Visual Studio 链接器未加载库

单击链接后使用 jQuery 加载图像

Ember 数据保存关系