我使用 Ember Data 已经有一段时间了,我对此非常满意。我喜欢它迫使我以合理的方式构建我的 REST api 的方式。
我遇到了一些问题,这是其中之一:我之前使用的是平面结构的模型:
App.Pageview = DS.Model.extend({
event: attr('string'),
value: attr('string'),
time: attr('date'),
count: attr('number')
});
在这种情况下,值是一个字符串中的 url。该模型适用于如下所示的 JSON:
{
"event" : "pageview",
"value" : "google.com/some/page",
"time" : "2013-01-31T16:30:00.000Z",
"count" : 14
}
我改变了 JSON 在数据库中的结构方式,使其更易于查询,现在它看起来像这样:
{
"event" : "pageview",
"value" : {
"url" : "google.com/some/page",
"domain" : "google.com",
"path" : "/some/page"
},
"time" : "2013-01-31T16:30:00.000Z",
"count" : 14
}
但现在我真的不知道该去哪里。我试着做这样的事情:
App.Pageview = DS.Model.extend({
event: attr('string'),
value: {
domain: attr('string'),
url: attr('string'),
path: attr('string')
},
time: attr('date'),
count: attr('number')
});
但这似乎不起作用,我像这样测试它:
console.log(item.get('value'));
console.log(item.get('value.domain'));
// console.log(item.get('value').get('domain')); // throws
console.log(item.get('value').domain);
并得到以下结果:http ://d.pr/i/izDD
所以我做了更多的挖掘,发现我可能应该做这样的事情:
App.Pageview = DS.Model.extend({
event: attr('string'),
value: DS.belongsTo('App.SplitUrl', {embedded:true}),
time: attr('date'),
count: attr('number')
});
App.SplitUrl = DS.Model.extend({
domain: attr('string'),
url: attr('string'),
path: attr('string')
});
但这不起作用,因为我得到一个错误:
Uncaught TypeError: Cannot call method 'hasOwnProperty' of undefined
这通常发生在我向我的 REST api 发送一个没有 id 的对象时。这是我的 REST api 的确切响应:
注意:我已经重载了适配器,以便它期望 id 在 _id 字段中,以便它可以更好/更轻松地使用 mongodb。这就是我重载适配器的方式:
App.Store = DS.Store.extend({
revision: 11,
adapter: DS.RESTAdapter.create({
serializer: DS.JSONSerializer.extend({
primaryKey: function(type) {
return '_id';
}
}),
namespace: 'api'
})
});
谁能帮我解决这个问题?