2

我正在使用 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

有没有人有任何想法?

4

1 回答 1

5

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

  1. 你打电话coll.fetch()
  2. Backbone 发出$.ajax呼叫。
  3. 你打电话console.log(coll),一个实时参考进入控制台。
  4. 您调用coll.at(1)orcoll.get(1)并没有得到任何结果,因为2尚未从服务器返回。
  5. 2 从服务器返回并填充您的集合。
  6. 然后你去看看控制台,但coll现在已经被填充了,所以coll控制台中的引用包括了在5中返回的模型。
  7. 困惑。

成功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
于 2012-07-18T19:45:52.867 回答