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