为什么在使用定义函数时无法获取 Backbone 集合模型?
Why can't get Backbone collection models when using a defined function?
假设我们有一个给定集合的实例(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
,但不行工作 !.
提前致谢。
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));
这个怎么样?
var collection = new SomeCollection(),
async = collection.fetch({
success: done
});
function done(collection, response, options) {
console.log('models are : ', collection.models)
}
您提供的示例代码的问题是您没有将 done
方法传递给 then()
,但它是 return 值,正如 Volodymyr Synytskyi 在他的回答中所解释的那样.
jQuery xhr
对象不知道 backbone.js 的存在(例如 collection/model 中定义的 parse
方法基于backbone 更新 collection/model)
当请求成功时,将触发成功回调。无法保证当这些触发时,backbone 会根据响应完成所有模型的创建。
这就是 backbone 提供成功回调的原因,它将在 backbone 完成其活动后触发。
您可以将全局处理程序作为成功回调传递,它将按 collection/model
、response
、options
作为参数按此顺序调用。
function done(collection,response,options){
console.log('models are : ',collection.models)
}
var collection = new SomeCollection(),
collection.fetch({
success: done
});
假设我们有一个给定集合的实例(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
,但不行工作 !.
提前致谢。
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));
这个怎么样?
var collection = new SomeCollection(),
async = collection.fetch({
success: done
});
function done(collection, response, options) {
console.log('models are : ', collection.models)
}
您提供的示例代码的问题是您没有将 done
方法传递给 then()
,但它是 return 值,正如 Volodymyr Synytskyi 在他的回答中所解释的那样.
jQuery xhr
对象不知道 backbone.js 的存在(例如 collection/model 中定义的 parse
方法基于backbone 更新 collection/model)
当请求成功时,将触发成功回调。无法保证当这些触发时,backbone 会根据响应完成所有模型的创建。
这就是 backbone 提供成功回调的原因,它将在 backbone 完成其活动后触发。
您可以将全局处理程序作为成功回调传递,它将按 collection/model
、response
、options
作为参数按此顺序调用。
function done(collection,response,options){
console.log('models are : ',collection.models)
}
var collection = new SomeCollection(),
collection.fetch({
success: done
});