为什么在使用定义的函数时无法获得Backbone集合模型?

时间:2016-01-13 10:20:13

标签: javascript asynchronous backbone.js backbone-collections

假设我们有一个给定集合的实例(在集合定义中指定了url),例如:

var collection = new SomeCollection(),
    async = collection.fetch();

当我在done方法中使用匿名回调时,它的工作正常,如下例所示:

async.done(function(){
    console.log('models are : ',collection.models)    
});

但是当我定义全局函数并尝试使用它而不是之前完成的回调时,为了稍微组织代码,我得到一个空模型数组:

function done(collection){
   console.log('models are : ',collection.models) 
} 


async.done(done(collection));

这里究竟出现了什么问题? 为什么它在获取调用之前处于收集状态?

注意:我还尝试使用.bind.call.apply,但无效!

提前谢谢。

3 个答案:

答案 0 :(得分:2)

async.done将函数作为参数。问题是你实际上将函数的结果作为参数传递给async.done。您需要将函数作为参数传递而不应用它。

请尝试以下代码:

function done(collection){
  console.log('models are : ',collection.models) 
} 

function success(collection){
  console.log('response: ',collection) 
}     

var collection = new SomeCollection(),
async = collection.fetch();

// you can use success or done method
// you can bind collection argument by yourself
async.success(success);
async.done(done.bind(this, collection));

答案 1 :(得分:1)

这个怎么样?

var collection = new SomeCollection(),
    async = collection.fetch({
        success: done
    });


function done(collection, response, options) {
   console.log('models are : ', collection.models) 
} 

答案 2 :(得分:1)

您提供的示例代码的问题在于您没有将done方法传递给then(),但它的返回值正如Volodymyr Synytskyi所解释的那样他的回答。

jQuery xhr对象不知道是否存在backbone.js(例如,基于哪个骨干更新集合/模型在集合/模型中定义的parse方法)

当请求成功时,将触发其成功回调。无法保证在这些火灾时,骨干网将根据响应创建所有模型。

这就是为什么骨干提供了一个成功的回调,这将在骨干完成其活动后触发。

您可以将全局处理程序作为成功回调传递,该回调将使用collection/modelresponseoptions作为该顺序中的参数进行调用。

function done(collection,response,options){
  console.log('models are : ',collection.models)
}

var collection = new SomeCollection(),
collection.fetch({
 success: done
});