夹具中的嵌入式记录错误:“无法调用未定义的方法'hasOwnProperty'

时间:2013-01-14 10:50:41

标签: ember.js ember-data

我正在尝试将灯具加载到我的嵌入记录的应用中。

从服务器加载数据(使用DS.RESTAdapter)有效,但当我尝试通过DS.FixtureAdapter加载数据时,它不起作用。

型号:

App.Post = DS.Model.extend
  title: DS.attr('string')
  comments: DS.hasMany('App.Comment')

App.Comment = DS.Model.extend
  text: DS.attr('string')
  # I'm not specifying DS.belongsTo('post') because comments could also exist 
  # with other objects.
  # Anyway, it does not work even with it. 

适配器:

App.Adapter = DS.FixtureAdapter.extend()
App.Adapter.map App.Post,
  comments:
    embedded: 'always'

商品

App.store = DS.Store.create
  revision: 11
  adapter: App.Adapter.create()

照明灯:

App.Comment.FIXTURES = []

App.Post.FIXTURES = [
  {
    id: "1"
    title: "My post"
    comments: [{
      id: "1"
      text: "My first comment" 
    }, {
      id: "2"
      text: "My second comment"
    }]
  }
]

控制台

post = App.store.find(App.Post, 1);

comments = post.get("comments");
console.log(comments.get('length')); // => 1

firstComment = comments.get('firstObject');
console.log(firstComment.get('id')); // => undefined
console.log(firstComment.get('name')); // => TypeError: Cannot call method `hasOwnProperty` of undefined

我认为这个问题与this question有关,也可能与this pull request有关。

使用的Ember版本:

修改

Here is the JSFiddle that illustrate the problem。 我还写了a failing test here

1 个答案:

答案 0 :(得分:2)

嗯,起初我猜测没有id的灯具,但没有。也许

App.Adapter = DS.FixtureAdapter.extend()
App.Adapter.map App.Product,
  groups:
    embedded: 'always' 

还应包含App.Post始终嵌入注释吗?

如果这不能解决这个问题,我怀疑夹具适配器不适合嵌入式,你也必须定义注释。

更新:在与@tomdale讨论之后,不会对夹具适配器进行任何更改,以使其能够加载嵌入式记录。所以我能提出的就是:

http://jsfiddle.net/4Zqvc/9/

顺便说一句,这就是汤姆所说的:

  

我不相信夹具适配器支持嵌入式记录       它有什么理由需要吗?       它也不支持underscored_property_names       夹具适配器的想法不是模仿服务器的JSON有效负载       它以Ember Data期望的格式提供存根数据       所以没有嵌入关系,属性名称是camelCased等等。