【问题标题】:Ember.js changing RESTAdapter JSON serializationEmber.js 更改 RESTAdapter JSON 序列化
【发布时间】:2013-04-26 19:47:07
【问题描述】:

我有一个从 API 查询的模型:

App.Deal = DS.Model.extend({
  name: DS.attr('string'),
  value_in_cents: DS.attr('number'),
  closed_time: DS.attr('date'),
  user: DS.attr('object'),
  company: DS.attr('object')
});

API 返回如下内容:

{ 
  pagination: { page: 1, total: 10 },
  entries: [ deal1, deal2, deal3, deal4 ]
}

我已将我的适配器更新为以下内容:

App.Adapter = DS.RESTAdapter.extend({
  url: 'http://api.pipelinedeals.com/api/v3',
  serializer: DS.RESTSerializer.extend({
    extractMany: function(loader, json, type, records) {
      var root = this.rootForType(type);
      var roots = this.pluralize(root);

      formattedJson = {};
      formattedJson[roots] = json.entries;
      delete formattedJson.pagination;
      this._super(loader, formattedJson, type, records);
    }
  })
});

newJson 具有我想要的格式,但出现以下错误:

Uncaught Error: assertion failed: You tried to use a attribute type (object) that has not been registered ember-1.0.0-rc.2.js:52

【问题讨论】:

  • 您确定var roots = this.pluralize(root); // deals 将真正的“交易”作为字符串返回吗?
  • 您不想将DS.RESTAdapterDS.JSONSerializer 一起使用。它不会起作用(或者你会在某些时候出现意想不到的行为)。
  • 查看其他 SO 问题 stackoverflow.com/questions/16037175/… 以自定义您的序列化程序。
  • 是的,根按预期工作。有道理,我将改用 DS.JSONSerializer。通过覆盖extract 方法,我现在收到以下错误:未捕获错误:断言失败:您的服务器返回了带有键分页的哈希,但您没有映射它 ember-1.0.0-rc.2.js:52 Ember.assert ember-1.0.0-rc.2.js:52 DS.JSONSerializer.DS.Serializer.extend.sideload ember-data.js:6602 DS.JSONSerializer.DS.Serializer.extend.extractMany ember-data.js :6546 superWrapper ember-1.0.0-rc.2.js:947
  • 另外,这个 SO 帖子 (stackoverflow.com/questions/16037175/…) 覆盖了 extract 方法,而 extractMany 出现在它之前,所以我收到了 this.sideload 中失败的错误 b/c。还有其他建议吗?

标签: javascript ember.js ember-data


【解决方案1】:

您想从DS.RESTSerializer 继承并覆盖extractMany 以获得类似的内容:

extractMany: function(loader, json, type, records) {
    var root = 'entries';

    if (json[root]) {
      var objects = json[root], references = [];
      if (records) { records = records.toArray(); }

      for (var i = 0; i < objects.length; i++) {
        if (records) { loader.updateId(records[i], objects[i]); }
        var reference = this.extractRecordRepresentation(loader, type, objects[i]);
        references.push(reference);
      }

      loader.populateArray(references);
    }
  },

由于您的服务器没有将类型设置为 root,因此您无论如何都无法使用侧载。

【讨论】:

  • loader.populateArray(references) 是抛出“未捕获错误:断言失败:您尝试使用尚未注册 ember-1.0.0-rc.2.js 的属性类型(对象)的行: 52" 我已经得到了一些变化。这甚至意味着什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2023-03-18
  • 2016-12-19
相关资源
最近更新 更多