Javascript Backbone.js,无法在回调上设置上下文
好的,我正在研究一个方法来覆盖模型上的fetch方法。我希望能够向它传递一个URL列表,并让它对每个URL进行提取,对结果应用一些处理,然后在它们全部完成后更新自己的属性。以下是基本设计:Javascript Backbone.js,无法在回调上设置上下文,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,好的,我正在研究一个方法来覆盖模型上的fetch方法。我希望能够向它传递一个URL列表,并让它对每个URL进行提取,对结果应用一些处理,然后在它们全部完成后更新自己的属性。以下是基本设计: 一个名为AllVinces的父“包装器”模型有一个自定义的获取函数,该函数在实例化时读取给定的URL列表 对于每个URL,它创建一个子模型,并在其上调用fetch,指定该URL以及一个成功回调 AllVinces实例还有一个属性progress,它需要在成功回调中更新该属性,以便它知道所有子获取何时完成 这就
// Define the app and a region to show content
// -------------------------------------------
var App = new Marionette.Application();
App.addRegions({
"mainRegion": "#main"
});
App.module("SampleModule", function (Mod, App, Backbone, Marionette, $, _) {
var MainView = Marionette.ItemView.extend({
template: "#sample-template"
});
var AllVenues = Backbone.Model.extend({
progress: 0,
join: function (model) {
this.progress++;
// do some processing of each model
if (this.progress === this.urls.length) this.finish();
},
finish: function() {
// do something when all models have completed
this.progress = 0;
console.log("FINISHED!");
},
fetch: function() {
successCallback = function(model) {
console.log("Returning from the fetch for a model");
Mod.controller.model.join(model);
};
_.bind(successCallback, this);
$.each(this.urls, function(key, val) {
var venue = new Backbone.Model();
venue.url = val;
venue.fetch({
success: successCallback
});
});
}
});
var Venue = Backbone.Model.extend({
toJSON: function () {
return _.clone(this.attributes.response);
}
});
var Controller = Marionette.Controller.extend({
initialize: function (options) {
this.region = options.region;
this.model = options.model;
this.listenTo(this.model, 'change', this.renderRegion);
},
show: function () {
this.model.fetch();
},
renderRegion: function () {
var view = new MainView({
model: this.model
});
this.region.show(view);
}
});
Mod.addInitializer(function () {
var allVenues = new AllVenues();
allVenues.urls = [
'https://api.foursquare.com/v2/venues/4a27485af964a52071911fe3?oauth_token=EWTYUCTSZDBOVTYZQ3Z01E54HMDYEPZMWOC0AKLVFRBIEXV4&v=20130811',
'https://api.foursquare.com/v2/venues/4afc4d3bf964a520512122e3?oauth_token=EWTYUCTSZDBOVTYZQ3Z01E54HMDYEPZMWOC0AKLVFRBIEXV4&v=20130811',
'https://api.foursquare.com/v2/venues/49cfde17f964a520d85a1fe3?oauth_token=EWTYUCTSZDBOVTYZQ3Z01E54HMDYEPZMWOC0AKLVFRBIEXV4&v=20130811'
];
Mod.controller = new Controller({
region: App.mainRegion,
model: allVenues
});
Mod.controller.show();
});
});
App.start();
我想你误解了工作原理<代码>.\uz.bind返回绑定函数,它不会就地修改它。事实上,在这方面,文档可能会更清晰一些 因此:
_.bind(successCallback, this);
没有意义,因为您忽略了返回的绑定函数。我想你应该这样说:
var successCallback = _.bind(function(model) {
console.log("Returning from the fetch for a model");
Mod.controller.model.join(model);
}, this);
还请注意,我添加了一个缺少的var
,可能您不希望successCallback
是全局的。谢谢,这真的很有帮助。我想我被语法弄糊涂了,因为它的兄弟方法bindAll()没有分配给任何对象。您遗漏的一点是实际上下文本身,它在函数之后传入。我在每个模型上用一些hokey处理更新了fiddle,只是为了测试它是否工作。它是!感谢您对缺少的此
参数的提示。调用.bindAll(obj,…)
时,在第一个参数中传递一个this
,以便下划线可以用绑定函数替换obj
中的属性。如果你看一下,你会发现.bindAll
只不过是一个obj[f]=\uj.bind(obj[f],obj)
循环。@TNguyen:这个答案可能很有趣:。