Ember.js 试图将jsonp与余烬数据一起使用,但无法使用余烬应用程序';自定义适配器中的s store.createRecord

Ember.js 试图将jsonp与余烬数据一起使用,但无法使用余烬应用程序';自定义适配器中的s store.createRecord,ember.js,ember-data,Ember.js,Ember Data,我正试图通过重写DS.RESTAdapter的findAll将余烬数据用于jsonp 我第一次尝试使用events.addObject(App.Event.create(Event)),但ember返回了一个错误:“您不应该在模型上调用create。相反,使用您想要设置的属性调用store.createRecord” 问题是,App.ApplicationStore.createRecord未定义,因此我无法实例化事件。有人知道发生了什么吗?如果有一种完全不同的方法让jsonp处理余烬数据,那也

我正试图通过重写DS.RESTAdapter的
findAll
将余烬数据用于jsonp

我第一次尝试使用
events.addObject(App.Event.create(Event))
,但ember返回了一个错误:“您不应该在模型上调用create。相反,使用您想要设置的属性调用store.createRecord”


问题是,
App.ApplicationStore.createRecord
未定义,因此我无法实例化事件。有人知道发生了什么吗?如果有一种完全不同的方法让jsonp处理余烬数据,那也没关系。

这种响应解析看起来更像是RESTSerializer的工作,而不是RESTAdapter的工作(尽管如果需要设置数据类型/url,您仍然需要适配器)

不是100%确定,但看起来您的响应是一个没有正确密钥的数组 如合同中所述

如果是这种情况,您可能希望为这样的事件创建序列化程序

App.EventsSerializer = DS.RESTSerializer.extend({
    extractFindAll: function(store, type, rawPayload, id, requestType) {
        this._super(store, type, { 'events': rawPayload }, id, requestType);
    }
});
上面的序列化程序将重新格式化响应,使其具有余烬数据可读性(根据上面的文档),余烬数据将处理其余部分

另外,当前存储作为第一个参数传递给DS.RESTAdapter.findAll,因此您应该通过该参数访问存储


包括

kaungst的回答确实很有帮助,但ember仍然抛出了一个错误。这让我找到了一个可行的解决方案,不过:

App.EventSerializer = DS.RESTSerializer.extend({
  normalizePayload: function(payload) {
    return {'events': payload};
  }
});

App.EventAdapter = DS.RESTAdapter.extend({
  findAll: function(store) {
    var events = [];
    $.ajax({
      url: '...',
      dataType: 'jsonp',
      success: function(response) {
        response.results.forEach(function(event) {
          events.addObject(store.createRecord('event', event));
        }, this);
      }
    });
    return events;
  }
});

我重写了DS.RESTSerializer的
normalizePayload
而不是
extractFindAll
,这修复了我得到的后续错误。此外,我定义了
App.EventSerializer
(单数),而不是
App.EventSerializer

,非常感谢-这真的很有帮助!将当前存储从第一个参数获取到findAll成功了,序列化程序的更改将我引向了正确的方向-在您的更改之后,我在处理route:events断言失败时遇到了
错误:findAll的响应必须是数组,而不是未定义的
。我找到了一种不同的方法来规范有效负载,所以我将把它作为一个单独的答案发布。很高兴能提供帮助,很高兴你能找到它!
App.EventSerializer = DS.RESTSerializer.extend({
  normalizePayload: function(payload) {
    return {'events': payload};
  }
});

App.EventAdapter = DS.RESTAdapter.extend({
  findAll: function(store) {
    var events = [];
    $.ajax({
      url: '...',
      dataType: 'jsonp',
      success: function(response) {
        response.results.forEach(function(event) {
          events.addObject(store.createRecord('event', event));
        }, this);
      }
    });
    return events;
  }
});