Backbone model.fetch()回调中的范围问题(调用setTimeout)

时间:2011-09-19 08:37:07

标签: javascript backbone.js

我有一个主视图(服务),其中包含一组子视图(服务)。每个子视图需要每5秒刷新一次。为此,我有以下[摘录]:

Service: Backbone.View.extend({
    ...

    initialize: function () {
        this.model.bind('change', this.render, this);
        _.bindAll(this, 'update');
    },

    render: function () {
        ...
        this.update();
        return this;
    },

    update: function() {
        this.model.fetch();
        setTimeout(this.update, 5000);
    }

    ...

setTimeoutupdate()的调用当然与this一样正确绑定到相关视图。

当我将setTimeout移动到fetch的回调中时会出现问题,因为this现在指向全局范围:

    update: function() {
        this.model.fetch({ success: function() {
            // this is now global
            setTimeout(this.update, 5000);
        }});            
    }

如何实现连续(非重叠)更新功能。或者 - 如何将视图的范围应用于this回调中的fetch

更新

刚刚回答这个旧问题,为了将来参考,我现在遵循这种模式,因为我在这里找到_.bind OTT:

    update: function() {
        var self = this;
        this.model.fetch({ success: function() {
            setTimeout(self.update, 5000);
        }});            
    }

2 个答案:

答案 0 :(得分:21)

其中一个选项是使用下划线_.bind功能:

update: function() {
    this.model.fetch({ success: _.bind(function() {
        setTimeout(this.update, 5000);
    }, this)});            
}

答案 1 :(得分:6)

我知道这是一个老问题,但成功和失败事件会返回三个值:模型,响应和选项。您可以拨打this.update

,而不是在成功函数中调用model.update
update: function() {
    this.model.fetch({ success: function( model, response, options) {
       setTimeout(model.update, 5000);
    }});            
}