【问题标题】:Backbone.js Collection fetch() throws Uncaught TypeError: Cannot read property 'idAttribute' of undefinedBackbone.js Collection fetch() throws Uncaught TypeError: Cannot read property 'idAttribute' of undefined
【发布时间】:2013-12-16 04:43:32
【问题描述】:

我正在努力学习 Backbone.js

它可以 GET、PUT 和 DELETE 一个模型。但是,当我创建一个集合时, fetch 方法给出了这个错误: 未捕获的类型错误:无法读取未定义的属性“idAttribute”(backbone.js:683)

这是我正在尝试的代码:

Person = Backbone.Model.extend({
    urlRoot: '/people'
});

PersonList = Backbone.Collection.extend({
    model: 'Person',
    url: '/people'
});

var personList = new PersonList();
personList.fetch();

在获取时,服务器返回以下 JSON,我认为这是正确的:

[{"id":1,"name":"Matt","description":"Worker"},{"id":3,"name":"Test","description":"Test person"}]

我正在使用 jQuery 2.0.3(也尝试过 1.10.2)、Underscore.js 1.5.2 和 Backbone.js 1.1.0

我做错了什么?

【问题讨论】:

  • 对于初学者,model 应该引用构造函数而不是字符串。扩展PersonList 时尝试model: Person
  • @fbynite 谢谢。我认为这解决了它。如果你回答我会接受...

标签: javascript backbone.js


【解决方案1】:

当您扩展Backbone.Collection 时,model 应该是对构造函数的引用,而不是字符串。所以你需要删除Person中的引号。

PersonList = Backbone.Collection.extend({
  model: Person,
  url: '/people'
});

这是Collection-model 的文档。

【讨论】:

    【解决方案2】:

    除了@fbynite 的回答。

    您还需要确保您引用的对象是一个有效主干模型(从Backbone.Model扩展的对象)。

    所以在调用model/collection/view的js文件时,要确保model文件比collection文件更早被调用。

    在我的例子中,我花了几个小时调查,我的问题是在模型之前启动集合,所以我建议不要使用行:App.AppModel = App.AppModel || {};。它不那么“安全”,但最好让代码中断,这样你就可以看到哪里出了问题。

    window.App = window.App || {};
    App.AppModel = App.AppModel || {}; //DO not use this line!!
    
    App.AppCollection = Backbone.Collection.extend({    
        model: App.AppModel,
    }); 
    

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2013-04-22
      • 1970-01-01
      • 2013-01-15
      • 2019-02-12
      • 2021-09-20
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多