2

我有一个 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 对象。我必须对我的自定义集合的所有重置做一些特别的事情吗?

4

2 回答 2

7

_prepareModelstacktrace 行提示您在收集后声明了您的模型。

您很可能将代码设置如下:


  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 行为。立即评估对象文字键/值对的值,这意味着它必须存在,否则它将作为未定义或引发其他错误返回。

于 2012-06-04T16:32:43.677 回答
0

正如 Derick 所说,您需要先声明模型,为此我通常只需将 App.coffee(主主干文件)的要求顺序更改为此

...
require_tree ./models
require_tree ./collections
...
于 2012-12-10T00:51:29.373 回答