嵌入的 hasMany 属性访问给出了“TypeError:无法调用未定义的方法‘hasOwnProperty’"; [英] Embedded hasMany attribute access gives "TypeError: Cannot call method 'hasOwnProperty' of undefined"

查看:15
本文介绍了嵌入的 hasMany 属性访问给出了“TypeError:无法调用未定义的方法‘hasOwnProperty’";的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用:

类似于这个问题('无法获得 hasMany 关联'),我我无法直接访问嵌入的 hasMany 记录,但可以通过模型的内容属性查看它们.

Similar to this question ('Unable to get hasMany association'), I am unable to access embedded hasMany records directly but can see them through the model's content attribute.

对于 JSON:

{
   "ref_book_search":{
      "query":"har",
      "results":[
         {
            "publisher":{
               "name":"Pangolin",
               "created":"2012-09-10T18:38:27.259515",
               "id":"3d2028e4fb91181e1a6e012313914f821",
               "is_active":true,
               "main_url":null,
               "resource_uri":"/api/v1/ref_publisher/3d2028e4fb91181e1a6e012313914f821"
            },
            "genre":"romcom",
            "id":"cc671f00fc2711e1e41612313914f821",
            "resource_uri":"/api/v1/ref_book/cc671f00fc2711e1e41612313914f821",
            "title":"Harry Placeholder and the Goblet of PBR"
         },
         {
            "publisher":{
               "name":"Hoof & Mouth",
               "created":"2012-10-10T14:31:27.259515",
               "id":"3d200e9afb9811e1a27417383914f821",
               "is_active":true,
               "main_url":null,
               "resource_uri":"/api/v1/ref_publisher/3d200e9afb9811e1a27417383914f821"
            },
            "genre":"horror",
            "id":"cc621f08fc2711e1b81612313914e821",
            "resource_uri":"/api/v1/ref_book/cc621f08fc2711e1b81612313914e821",
            "title":"Harvey Weinstein Holiday Cookbook"
         }
      ]
   }
}

还有 app.js(注意 map 语句,这是上一个问题中建议的解决方案):

And app.js (note the map statements, which were the solution suggested in the prior question):

var App = Ember.Application.create();

DS.RESTAdapter.configure("plurals", {"ref_book_search" : "ref_book_search"});

App.store = DS.Store.create({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    bulkCommits: false,
    namespace: "api/v1"
  })
});

DS.RESTAdapter.map('App.RefBookSearch', {
  primaryKey: 'query'
});

App.store.adapter.serializer.map('App.RefBookSearch', {
  results: {embeddded: 'load'}
});

App.store.adapter.serializer.map('App.RefBook', {
  publisher: {embeddded: 'load'}
});

App.RefPublisher = DS.Model.extend({
  name : DS.attr('string'),
  created : DS.attr('date'),
  isActive : DS.attr('boolean'),
  mainUrl : DS.attr('string')
});

App.RefBook = DS.Model.extend({
  publisher: DS.belongsTo('App.RefPublisher'),
  title : DS.attr('string'),
  genre : DS.attr('string')
});

App.RefBookSearch = DS.Model.extend({
  query: DS.attr('string'),
  results: DS.hasMany('App.RefBook')
});

App.Router.map(function(match) {
  match('/').to('query'),
  match('/query/:ref_book_search_id').to('query')
});

App.QueryController = Ember.Controller.extend({
  bookSearch: null,
  results: []
});

App.QueryRoute = Ember.Route.extend({
  setupControllers: function(controller, refBookSearch) {
    controller.set('bookSearch', refBookSearch)
    controller.set('results', refBookSearch.get('results').content)
  }
})

App.initialize();

一开始一切都很好,就像其他海报一样:

Everything looks fine at first, just like other poster:

search = App.RefBookSearch.find('ha')
search.get('query')
// => "ha"
results = search.get('results')
results.get('firstObject') instanceof App.RefBook
// => true

然后:

results.forEach(function(result) { console.log(result.get('title')) })
// => TypeError: Cannot call method 'hasOwnProperty' of undefined

通过内容访问显示数据在那里:

Accessing via content shows the data is there:

results.content.forEach(function(result) { console.log(result.title) })
// => Harry Placeholder and the Goblet of PBR
// => Harvey Weinstein Holiday Cookbook

现在,如果我再次尝试直接访问,则会得到一个略有不同的错误:

Now if I try accessing directly again, I get a slightly different error:

results.forEach(function(result) { console.log(result.get('title')) })
// => undefined x 2

这可能与几天前提交的此错误有关,也可能无关.

This may or may not be related to this bug filed a few days ago.

我觉得我已经尝试了这里的一切;我希望我只是错过了一些简单的东西.任何指针都非常感谢.谢谢.

I feel like I've tried everything here; I hope I'm just missing something simple. Any pointers very much appreciated. Thanks.

推荐答案

这最终对我有用.似乎有一些操作顺序敏感性,即在创建商店之前进行配置和映射.另请注意,adapter.map 是一个在序列化程序上执行映射的便利函数.

This is what ultimately worked for me. There seems to be some order-of-operations sensitivity i.e., doing the configure and map before creating the store. Also note that adapter.map is a convenience function that performs the mapping on the serializer.

App.Adapter = DS.RESTAdapter.extend()

App.Adapter.configure("plurals", {
  "ref_book_search" : "ref_book_search",
  "ref_book" : "ref_book",
  "ref_publisher" : "ref_publisher"
});

App.Adapter.configure('App.RefBookSearch', {
  primaryKey: 'query'
});

App.Adapter.map('App.RefBookSearch', {
  results: {'embedded': 'load'}
});

App.Adapter.map('App.RefBook', {
  publisher: {'embedded': 'load'}
});

App.store = DS.Store.create({
  revision: 11,
  adapter: App.Adapter.create({
    bulkCommits: false,
    namespace: "api/v1"
  })
});

这篇关于嵌入的 hasMany 属性访问给出了“TypeError:无法调用未定义的方法‘hasOwnProperty’";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆