1

我使用 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 的确切响应:

http://d.pr/n/UyW0

注意:我已经重载了适配器,以便它期望 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'
  })
});

谁能帮我解决这个问题?

4

1 回答 1

1

假设您使用的是 ember-data 修订版 11,请尝试将您的值配置为嵌入在适配器中。

DS.RESTAdapter.map('App.SplitUrl',{value:{ embedded:'always'}}); 
于 2013-02-01T12:43:17.927 回答