【问题标题】:Ember.js embedded records don't workEmber.js 嵌入记录不起作用
【发布时间】:2015-09-23 16:21:56
【问题描述】:

我有一个像

这样的 json
{
   "meta":{
      "per":20,
      "page":1,
      "total":2
   },
   "users":[
      {
         "id":119506,
         "first_name":"erglk",
         "last_name":"wfe",
         "email":"bent@exemple.com",
         "groups":[
            {
               "id":5282,
               "name":"test"
            },
            {
               "id":8880,
               "name":"everybody"
            }
         ]
      },
      {
         "id":119507,
         "first_name":"eriglk",
         "last_name":"wife",
         "email":"benit@exemple.com",
         "groups":[
            {
               "id":5284,
               "name":"testf"
            },
            {
               "id":8880,
               "name":"everybody"
            }
         ]
      }
   ]
}

目前访问用户没有问题,但访问组数组有一些困难。我试过hasManybelongsTo 没有成功。我有错误。 我读过几篇关于EmbededRecordMixin 的文章,但没有任何成功。

如果我在我的模型中声明:

export default DS.Model.extend({
  first_name: DS.attr('string'),
  last_name: DS.attr('string'),
  email: DS.attr('string'),
  groups: DS.attr('group')
});

我得到:处理路由时出错:用户断言失败:无法找到“组”的转换错误:断言失败:无法找到“组”的转换

【问题讨论】:

  • 您使用的是什么版本的 Ember Data 以及哪些适配器/序列化程序?
  • @TylerIguchi ember 2 和 RESTSerializer

标签: ember.js ember-data ember-cli


【解决方案1】:

我们使用DS.attr 告诉 Ember 这个字段是一个模型的属性,我们可以选择指定这个属性的类型。默认情况下,仅允许的类型为 stringnumberbooleandate。为了支持自定义类型,应定义特殊类(转换)。这就是 Embers 试图通过此错误消息告诉您的内容。如何定义这样的类,你可以找到here

但是,您不需要为您的任务定义自定义转换。你需要定义一个关系:

export default DS.Model.extend({
  first_name: DS.attr('string'),
  last_name: DS.attr('string'),
  email: DS.attr('string'),
  groups: DS.hasMany('group', {async: false})
});

并使用 EmbeddedRecordMixin,如官方 docs 中所述。我可以向您保证,它按照那里的描述工作。

【讨论】:

  • 谢谢@gennady-dogaev。我已经在文档中设置了相同的RESTSerializer,里面有attrs: { groups: { embedded: 'always' } }。我也在 models/group.js : export default DS.Model.extend({ user: DS.belongsTo('user'), name: DS.attr('string'), });` 但是当我得到尝试进入页面:Error while processing route: users Assertion Failed: Passing classes to store methods has been removed. Please pass a dasherized string instead of undefined。他在等别的东西……
  • 错误似乎来自我的用户路线:export default Ember.Route.extend({ model(params) { return this.store.query('user', params); } });
  • 你用什么适配器? REST 还是 JSON?对于您的响应结构,您应该使用 RESTAdapter
  • 一个 RESTAdapter。 :/ 当我从我的模型中删除 groups: DS.hasMany('group') 时,它也可以再次工作。
  • 尝试将isNewSerializerAPI: true 属性添加到您的序列化程序中。我不确定它是否会有所帮助,但值得一试:export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { isNewSerializerAPI: true, attrs: { groups: { embedded: 'always' } } });
【解决方案2】:

我遇到了同样的问题,并根据 Gennady 和 Beni 的回复找到了解决方案,但我仍然需要一些时间才能启动并运行。

http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html

我创建了 app/serializers/user.js:

import DS from 'ember-data';
export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
    isNewSerializerAPI: true,
    attrs: {
        groups: { embedded: 'always' },
    }
});

在 app/model/user.js 中

export default DS.Model.extend({
     groups: DS.hasMany('group', {async: false}),
});

然后模型直接加载嵌入的属性!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多