Backbone Collection.reset()不适用于扩展集合

时间:2012-06-04 16:07:11

标签: javascript collections backbone.js

我有一个Backbone集合

jQuery ->
  class App.Collections.List extends Backbone.Collection
    model: App.Models.ListItem

我正在尝试在页面加载时初始化集合:

var list = new App.Collections.List;
list.reset(<%= @data.to_json.html_safe %>)

这会在主干库中引发JS错误。

Uncaught TypeError: undefined is not a function application.js:597
f.extend._prepareModel application.js:597
f.extend.add application.js:591
f.extend.reset application.js:595
(anonymous function)

但是,如果我将代码更改为:

var list = new Backbone.Collections;
list.reset(<%= @data.to_json.html_safe %>)

重置工作,并且集合被填充 - 认为集合中的对象似乎不知道它们应该是ListItem对象。我是否必须对我的自定义集合的所有重置做一些特别的事情?

2 个答案:

答案 0 :(得分:7)

_prepareModel stacktrace行提示您在收集后声明了模型。

您最有可能将代码设置为:


  class App.Collections.List extends Backbone.Collection
    model: App.Models.ListItem

  class App.Models.ListItem extends Backbone.Model

当你尝试在集合的ListItem属性中使用它时,因为model尚未声明,它将会失败。您实际上是将模型属性设置为undefined

您需要先声明模型:


  class App.Models.ListItem extends Backbone.Model

  class App.Collections.List extends Backbone.Collection
    model: App.Models.ListItem

请注意,这不是CoffeeScript或Backbone的限制。这是由使用对象文字引起的JavaScript行为。立即计算对象文字键/值对的值,这意味着它必须存在,否则将返回为未定义或抛出其他错误。

答案 1 :(得分:0)

正如Derick所说,你需要首先声明模型,为此我只需要更改需要命令App.coffee(主骨干文件)到此

...
require_tree ./models
require_tree ./collections
...