繁体   English   中英

带有替代主键的模型的id为null的Ember.js findRecord()调用

[英]Ember.js findRecord() called with id null for model with alternative primary key

我的Ember.js应用程序有问题。 它使用JSONAPI{Adapter,Serializer}和以下模型:

models/node.js

App.Node = DS.Model.extend(
{
  // (node 'name' field used as primary key for serialization)

  info: DS.attr('string'),
  children: DS.hasMany('node', { inverse: null })
}

代表命名节点的树。

JSONAPIAdapter( adapters/application.js )实现了queryRecord()query()findRecord()findAll()函数,以转换来自服务器的Ember.js查询。 这一切都很好。

JSONAPISerializer实现函数normalizeResponse()以将服务器响应JSON数据转换为json:api格式。 在序列化器中,主键定义为节点的“名称”字段:

serializers/application.js

App.ApplicationSerializer = DS.JSONAPISerializer.extend(
{
  primaryKey: 'name',

  normalizeResponse(store, primaryModelClass, payload, id, requestType)
  {
    // ...
  }
});

序列化器生成的json:api数据示例为:

{
  "data": [
    {
      "type": "node",
      "attributes": {
        "info": "Root node"
      },
      "relationships": {
        "children": {
          "data": [
            {
              "type": "node",
              "name": "Root/SubNode1"
            }
          ]
        }
      },
      "name": "Root"
    }
  ],
  "included": [
    {
      "type": "node",
      "attributes": {
        "info": "Subnode 1"
      },
      "relationships": {
        "children": {
          "data": [
          ]
        }
      },
      "name": "Root/SubNode1"
    }
  ]
}

我使用Ember.js版本2.7.0和Ember检查器。

一旦应用程序运行,并且数据已加载到模型中,我就可以在模型中看到Ember检查器中的数据。 但是,在“数据”视图中调查模型数据(并选择一个项目)时,我发现Ember正在调用id = null adapter:findRecord() ,从而导致了错误的查询。 似乎模型数据不正确。

当我在JSONAPISerializer中删除主键定义并在id字段中将节点的name字段复制为Ember默认主键时,一切都很好。 我的主键定义缺少什么? Ember指南仅说明有关序列化器( https://guides.emberjs.com/v2.7.0/models/customizing-serializers/#toc_ids )中primaryKey信息。

提前谢谢了!

您需要定义name字段以保存ID。

App.Node = DS.Model.extend(
{
  // (node 'name' field used as primary key for serialization)
  name: DS.attr('string'),
  info: DS.attr('string'),
  children: DS.hasMany('node', { inverse: null })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM