Ember.js 试图将jsonp与余烬数据一起使用,但无法使用余烬应用程序';自定义适配器中的s store.createRecord
我正试图通过重写DS.RESTAdapter的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处理余烬数据,那也
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;
}
});