7

我有一个路由器访问其集合。我的for循环没有遍历模型,所以我尝试记录集合以查看它返回的内容。当我直接登录集合时发现,我看到所有的模型都如预期的那样。但是如果我尝试记录集合的模型属性,我会得到一个空数组!这没有意义。这些线路直接相互关联。我尝试改变顺序并得到相同的结果。为什么backbone.js在访问模型时返回一个空数组?

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 
+1

抓取完成并成功重置或在您登录时向模型添加模型? – user500198 2012-02-20 01:02:35

+0

我只能假设它是这样做的,2个日志是正确的,在这两个调用之间会是一个纳秒级的问题。仍然可能,但是如果你测试了几次,它至少应该是一个不稳定的结果......它不能总是在这两个日志调用之间完成加载。 – Sander 2012-02-20 01:37:49

+1

我不明白为什么它正在记录,但我发现我需要在视图中的集合上添加一个事件侦听器,以确保它已加载。 – 2012-02-20 02:40:22

回答

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 
5

吉姆,

这不解决您的问题 - 你已经工作了这一点。但它解释了为什么你看到你看到的控制台输出。

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

当你在控制台看着它,在当时的console.log(本)运行模型区域是空的,但在当时,你看日志,收集已完成加载模型和内部阵列变量被更新,并且对象日志中的该变量的参考显示当前内容。

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

该行为非常简单,看到这个小提琴.. http://jsfiddle.net/bendog/XVkHW/

+0

谢谢!这真的很有趣,很有可能在未来知道。那里我真的很困惑。 – 2012-02-20 04:02:21

+0

@JimJeffers。不用担心,高兴地带来一些光线,我经历过同样的困惑...... :) – Ben 2012-02-20 05:20:03

0

您可以使用承诺。 (.done会做得很好)

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

这会给你@收集的模型中取出,并准备去。

,或者如果你不需要强制应用程序等待,

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

这两个会让你做你想做的。

相关问题