提问者:小点点

Ember. js findRecords()使用id null调用,用于具有替代主键的模型


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

模型/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(适配器/application. js)实现了函数queryRecords()query()findRecords()findAll()来翻译来自服务器的Ember.js查询。这一切都很好。

JSONAPISerializer实现函数规范化响应(),将服务器响应JSON数据转换为json: api格式。在序列化器中,主键被定义为节点的'name'字段:

序列化rs/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正在调用适配器:findRecords(),其中id=null,导致错误的查询。不知何故,模型数据似乎不正确。

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

提前非常感谢!


共1个答案

匿名用户

您需要定义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 })
}