如何设置Backbone模型获取的错误处理程序的上下文?

时间:2014-02-27 15:33:00

标签: javascript backbone.js backbone-views backbone-routing

我正在使用路由器来组织我的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保留在路由器范围内?

2 个答案:

答案 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");
}