我正在使用路由器来组织我的Backbone应用程序。在我的编辑路线中,我在模型实例上调用fetch来获取编辑表单的模型数据:
App.Router = Backbone.Router.extend({
routes: {
"": "index",
"edit(/:id)": "edit"
},
index: function () {
_.bindAll(this, "getItemByID", "onModelFetchError", "showError");
},
edit: function (id) {
this.formEditItem = new App.Views.FormEditItem({model: this.getItemByID(id), parent: this});
},
getItemByID: function(id) {
var item = new App.Models.Item({id: id});
item.fetch({
success: function(model, response, options) {
console.log('Success');
return model;
},
error: this.onModelFetchError
})
},
onModelFetchError: function (model, response, options) {
this.showError(response.responseText);
},
showError: function(msg) {
this.error = new App.Views.Error({parent: this, message: msg});
}
});
获取调用工作正常,但我在处理错误时遇到问题。我想实例化一个错误视图并在其中显示消息。但是当我尝试这段代码时,我得到“Uncaught TypeError:Object [object global]没有方法'showError'”。似乎将onModelFetchError指定为fetch错误的处理程序会将其置于全局范围内,即使我使用_.bindAll将其绑定到Router也是如此。
有没有简单的方法可以确保onModelFetchError保留在路由器范围内?
答案 0 :(得分:0)
尝试
getItemByID: function(id) {
var item = new App.Models.Item({id: id});
var self = this; // this changed
item.fetch({
success: function(model, response, options) {
console.log('Success');
return model;
},
error: self.onModelFetchError // this changed
})
},
答案 1 :(得分:0)
您正在调用由路由“”触发的索引函数内的_.bindAll()
,因此如果您不触发该路由,它们将永远不会绑定到上下文对象。我建议为你的路由器创建一个初始化方法,这样你就可以绑定其中任何路由的所有函数。
initialize: function() {
_.bindAll(this, "getItemByID", "onModelFetchError", "showError");
}