0

比方说,我们有一个给定集合的一个实例(网址是集定义中指定的),例如:为什么在使用定义的函数时无法获得Backbone集合模型?

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不工作!

预先感谢您。

回答

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)); 
+0

但是,如果我不提供收集作为参数,那么它没有定义内功能!所以我得到了很好的''Uncaught TypeError:无法读取属性'模型'的未定义(...)''错误 – Ismail

+0

如果你想传递一些参数或这个值到回调函数,你可以利用[bind](https:/ /developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)方法。我已经更新了我的答案 –

+0

即使使用“bind”,“call”,“apply”,它也不能工作! – Ismail

1

这个怎么样?

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


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

它工作thx :) – Ismail

1

与您所提供的示例代码中的问题是,你不及格done方法then(),但它的返回值作为弗拉基米尔Synytskyi在他的回答解释。


jQuery的xhr对象不知道Backbone.js的存在(例如,在收集/模型中定义的方法parse基于其骨架更新收集/模型)

当请求成功的,它的成功回调将被解雇。不能保证,当这些火灾时,骨干将根据响应完成所有模型的创建。

这就是骨干提供成功回调的原因,在主干完成其活动后将被解雇。

您可以传递您的全局处理函数作为成功回调函数,将以collection/modelresponse,options作为参数按顺序调用。

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

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