backbone.js collection.get()undefined

Ben*_*awk 2 javascript collections backbone.js

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

我想抓住一个模型并将其从集合中拉出来.但是,我尝试的一切都返回undefined.

这是我填充集合的方式

var coll = new TestCollection();
coll.fetch();
Run Code Online (Sandbox Code Playgroud)

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

child
_byCid: Object
_byId: Object
_onModelEvent: function () { [native code] }
_removeReference: function () { [native code] }
length: 7
models: Array[7]
__proto__: ctor
Run Code Online (Sandbox Code Playgroud)

不过,我已经尝试了一大堆的办法,以便包括抢这些模型从收集coll.at(1)coll.get(1)但每个回报undefined.

有没有人有任何想法?

mu *_*ort 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. 混乱.

成功fetch触发"reset"事件,因此如果您想知道何时填充集合,您应该正在监听该事件:

coll.on('reset', this.some_method);
Run Code Online (Sandbox Code Playgroud)

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

coll.fetch({
    success: function(collection, response) {
        //...
    }
});
Run Code Online (Sandbox Code Playgroud)

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

coll.fetch({ reset: true }); // This will now trigger a 'reset' event
Run Code Online (Sandbox Code Playgroud)