backbone.js collection.get()undefined

时间:2012-07-18 18:43:22

标签: javascript collections backbone.js

我正在使用Backbone,我有一个完整的7个模型的集合。

我想抓住一个模型并将其从集合中拉出来。但是,我尝试的所有内容都会返回undefined

以下是我如何填充集合

var coll = new TestCollection();
coll.fetch();

一个简单的控制台日志调用显示该集合是从JSON文件

填充的
child
_byCid: Object
_byId: Object
_onModelEvent: function () { [native code] }
_removeReference: function () { [native code] }
length: 7
models: Array[7]
__proto__: ctor

但是我尝试了一大堆方法,以便从包含coll.at(1)coll.get(1)的集合中获取其中一个模型,但每个模型都返回undefined

有没有人有任何想法?

1 个答案:

答案 0 :(得分:5)

fetch方法是一个AJAX调用,这意味着它是异步的。您的console.log调用会将实时引用放入控制台(因此它有点异步),因此您最终会遇到以下事件:

  1. 您致电coll.fetch()
  2. Backbone发出$.ajax来电。
  3. 您拨打console.log(coll)并在控制台中输入实时参考。
  4. 您致电coll.at(1)coll.get(1)并且一无所获,因为 2 尚未从服务器返回。
  5. 2 从服务器返回并填充您的收藏。
  6. 然后你去查看控制台,但现在已经填充了coll,因此控制台中的coll引用包含以 5 返回的模型。
  7. 混乱。
  8. 成功fetch会触发"reset"事件,因此如果您想知道何时填充该集合,您应该收听该事件:

    coll.on('reset', this.some_method);
    

    或者,对于一次性通知,您可以使用success回调:

    coll.fetch({
        success: function(collection, response) {
            //...
        }
    });
    

    在较新版本的Backbone中,如果您想要重置事件,则需要将reset: true选项传递给fetch

    coll.fetch({ reset: true }); // This will now trigger a 'reset' event