【问题标题】:Ember.js findRecord() called with id null for model with alternative primary keyEmber.js findRecord() 使用 id null 调用具有备用主键的模型
【发布时间】:2016-12-26 14:28:37
【问题描述】:

我的 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 的信息。

提前非常感谢!

【问题讨论】:

  • 你有没有找到一个好的解决方案?我遇到了类似的事情

标签: javascript json ember.js


【解决方案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 })
}

【讨论】:

  • 您好易卜拉欣,感谢您的回复!我以前试过这个,但是这个成员'name'将保持未定义。我猜 Ember 认为它更像是一个属性成员(而不是顶级成员)。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2017-02-20
相关资源
最近更新 更多