为什么backbone.js在访问模型时返回一个空数组?

时间:2012-02-20 00:52:17

标签: javascript model-view-controller backbone.js coffeescript

我有一个路由器访问其集合。我的for循环没有遍历模型,所以我尝试记录集合以查看它返回的内容。当我直接记录集合时,我看到了所有模型。但是如果我尝试记录集合的models属性,我会得到一个空数组!这没有意义。这些线直接相互跟随。我尝试改变顺序并获得相同的结果。

console.log(this.collection);
=> Shots
    _byCid:    Object
    _byId:     Object
    length:    15
    models:    Array[15]
    __proto__: Shots
    ...

console.log(this.collection.models);
=> []

console.log(this.collection.length);
=> 0

为什么会发生这种情况?

以下是路由器中的代码,以便更好地了解此代码触发的位置:

# Routers
class Draft.Routers.Shots extends Backbone.Router
  routes:
    ''            : 'index'
    'shots/:id'   : 'show'

  initialize: ->
    @collection = new Draft.Collections.Shots()
    @collection.fetch()

  index: ->
    console.log @collection
    console.log @collection.models

3 个答案:

答案 0 :(得分:5)

吉姆,

这不能解决你的问题 - 你已经解决了这个问题。但它解释了为什么你看到你看到的控制台输出。

运行console.log(this)时,输出对象本身,控制台将 references (指针,如果你喜欢)链接到内部变量。

当您在控制台中查看它时,在console.log(this)运行时,模型区域为空,但当时看起来在日志中,集合已完成加载模型并更新内部数组变量,并且对象日志中该变量的引用显示当前内容。

基本上在console.log(this)中,内部模型变量会继续其正常生活,控制台会在您查看时显示当前状态,而不是在您调用它时。 使用console.log(this.models),数组将按原样转储,不保留引用,并逐个转储所有内部值。

这种行为很容易通过短暂的超时重现,请看这个小提琴.. http://jsfiddle.net/bendog/XVkHW/

答案 1 :(得分:2)

我发现我需要监听要重置的集合。因此,我没有将模型传递到视图中,而是创建了另一个期望集合的视图,并听取了'reset'事件来为视图触发'render'。

# Routers
class Draft.Routers.Shots extends Backbone.Router
  routes:
    ''            : 'index'
    'shots/:id'   : 'show'

  initialize: ->
    @collection = new Draft.Collections.Shots()
    @collection.fetch()

  index: ->
    view = new Draft.Views.Desktop(collection: @collection)

# Views
class Draft.Views.Desktop extends Backbone.View
  el: $("body")

  initialize: ->
    @collection.on("reset",@render,this)

  render: ->
    console.log @collection
    console.log @collection.length

答案 2 :(得分:0)

您可以使用承诺。 (。完成后会好起来的)

@collection.fetch().done =>
  for model in @collection.models
    console.log model

这将为你提供@ collection的模型,并准备好了。

或者如果您不需要强制应用等待,

@collection.on 'sync', =>
  for model in @collection.models
    console.log model

这些都可以让你做你想做的事。