我一直在努力让Emberjs前端(使用Ember Data)与我的Flask API后端一起工作。适配器似乎正在工作,因为当列出'列表'路径在浏览器中被点击,我也可以检查网络检查器中的原始对象,但是在Ember Inspector中它显示有关联的模型,但是所有数据都是未定义的,路径没有被加载(模板没有显示,没有数据)尽管我付出了努力,我仍然不断得到这个错误:
处理路线时出错:列出断言失败:您必须包含' id'用于列在传递给' push'
的对象中我发送的对象如下:
{
"data": {
"attributes":{
"make": "BMW",
"model": "640I",
"odometer": "11530",
"trim": "CPE 640I",
"year": "2016"
},
"id": "1",
"type": "listings"
}
}
据我所知,它符合Ember Data所需的json-api格式。
这是我的适配器,序列化程序,路由和模型的代码。
/adapters/application.js
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
host: 'http://localhost:5000',
namespace: 'PS/api_v1_0'
});
/serializers/application.js
import DS from 'ember-data';
import Ember from "ember";
export default DS.JSONAPISerializer.extend({
keyForAttribute: function(key){
return Ember.String.dasherize(key);
},
serializeId: function(id) {
return id.toString();
}
});
/serializers/listing.js
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
normalizeFindRecordResponse(store, type, payload){
return {
data: {
attributes: {
exteriorColor: payload.exterior_color,
interiorColor: payload.interior_color,
make: payload.make,
mmrPrice: payload.mmr_price,
model: payload.model,
odometer: payload.odometer,
trim: payload.trim,
year: payload.year,
},
id: payload.login,
type: type.modelName,
}
};
}
});
/models/listing.js
import DS from 'ember-data';
export default DS.Model.extend({
exteriorColor: DS.attr('string'),
interiorColor: DS.attr('string'),
make: DS.attr('string'),
mmrPrice: DS.attr('string'),
model: DS.attr('string'),
odometer: DS.attr('string'),
trim: DS.attr('string'),
year: DS.attr('string'),
});
/routes/listing.js
import Ember from 'ember';
export default Ember.Route.extend({
model(){
return this.store.findRecord('listing', '1');
}
});
我觉得我已经尝试了一切来尝试塑造JSON以便通过Ember Data进行序列化,但是我已经碰壁了,找不到任何其他相关问题 - 任何人都知道如何解决这个问题?
答案 0 :(得分:0)
问题有两方面:在序列化程序中,我访问了id为payload.login
而不是payload['data'].id
的错误变量。此外,我没有为有效负载对象索引属性的属性值。
我的新序列化程序如下所示:
/serializers/listing.js
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
normalizeFindRecordResponse(store, type, payload){
//console.log(payload['data']['attributes']);
return {
data: {
attributes: {
exteriorColor: payload['data']['attributes'].exterior_color,
interiorColor: payload['data']['attributes'].interior_color,
make: payload['data']['attributes'].make,
mmrPrice: payload['data']['attributes'].mmr_price,
model: payload['data']['attributes'].model,
odometer: payload['data']['attributes'].odometer,
trim: payload['data']['attributes'].trim,
year: payload['data']['attributes'].year,
},
id: payload['data'].id,
type: type.modelName,
}
};
}
});