【问题标题】:Backbone Collection.reset() doesn't work on extended CollectionsBackbone Collection.reset() 不适用于扩展集合
【发布时间】:2012-06-04 16:07:11
【问题描述】:

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

【问题讨论】:

  • 为我工作,只要我能重现你的设置:jsfiddle.net/LXW6h
  • 模型和集合加载顺序不正确。请参阅下面 Derick 的回答以及我对 hom 的后续评论。

标签: javascript collections backbone.js


【解决方案1】:

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

您的代码很可能是这样设置的:


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

  class App.Models.ListItem extends Backbone.Model

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

你需要先声明模型:


  class App.Models.ListItem extends Backbone.Model

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

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

【讨论】:

  • 谢谢,这就是问题所在。我将集合放在模型之上的集合之上,因为我试图建模一个嵌套列表,所以我的 ListItem 模型有一个属性“children”,它是一个 App.Collections.List ...我认为使用关系主干模块将是我最好的最适合实现这一目标?
  • Backbone 可能允许您将函数指定为 model 属性...App.Collections.List = Backbone.Collection.extend({ model: function(){ return MyModelType; }); 这不会受到相同的限制,因为该函数将在运行时执行,当访问 @ 987654329@ 属性。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2019-02-26
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多