【问题标题】:Why is backbone.js returning an empty array when accessing models?为什么backbone.js在访问模型时返回一个空数组?
【发布时间】:2012-03-10 10:16:01
【问题描述】:

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

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

【问题讨论】:

  • 在您登录时获取是否完成并成功重置或将模型添加到集合中?
  • 我只能假设它确实如此,两个日志彼此紧随其后,这两个调用之间只有纳秒的问题。虽然仍然有可能,但如果您对其进行多次测试,它至少应该是一个不稳定的结果......它不能总是在这两个日志调用之间完成加载。
  • 我不明白它为什么会记录,但我发现我需要在视图中的集合上添加一个事件侦听器以确保它已加载。

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


【解决方案1】:

您可以使用承诺。 (.done 就可以了)

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

这将为您提供@collection 的模型并准备好使用。

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

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

这两者都可以让你做你想做的事。

【讨论】:

    【解决方案2】:

    我发现我需要监听集合以重置。因此,我没有将模型传递到视图中,而是创建了另一个期望集合的视图,并监听了“重置”事件以触发视图的“渲染”。

    # 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
    

    【讨论】:

      【解决方案3】:

      吉姆,

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

      当您运行console.log(this) 时,您会输出对象本身,并且控制台会将references(如果您愿意,可以使用指针)链接到内部变量。

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

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

      这种行为很容易在很短的超时时间内重现,请参阅this fiddle..http://jsfiddle.net/bendog/XVkHW/

      【讨论】:

      • 谢谢!这真的很有趣,将来很高兴知道。我真的很困惑。
      • @JimJeffers。不用担心,很高兴带来一些光明,我之前也经历过同样的困惑.. :)
      猜你喜欢
      • 2012-08-26
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2015-03-18
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多