Backbone:在视图上限制集合过滤器事件

时间:2013-03-29 16:50:39

标签: ajax backbone.js underscore.js

在我的应用程序中,我将视图显示为一个表,其中包含从服务器获取的集合。我希望用户能够过滤此集合,在文本框中编写搜索字符串。

问题是每次击键都会触发keyup事件,我想避免这种情况,以免使用无用的请求使服务器过载。所以我想使用下划线的油门功能,但我不能以一种有效的方式实现它。

events: {
    'keyup #filter' : 'filter_collection'
}

filter_collection: function(e) {
    var el, throttled, value;

    el = e.currentTarget;
    value = $(el).val();
    this.collection.server_api.filter = value;
    throttled = _.throttle(_.bind(this.update_collection, this), 5000);
    throttled();
}

update_collection: function() {
    var promise, self;

    self = this;
    promise = this.collection.fetch();
    $.when(promise).then(function() {
      self.collection.pager();
    });
}

通过这种方式,每次击键都会调用update_collection函数,就像之前没有throttle一样。我也尝试使用debounce,但所有请求都会在等待时间之后触发。 我缺少什么?

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:12)

每次发生 keyup 事件时调用的函数是filter_collection,它本身不受限制,你在里面创建的函数会被立即调用并丢弃。

您应该将事件绑定到受限制的函数:

var V = Backbone.View.extend({
    events: {
        'keyup #filter' : 'filter_collection'
    },

    filter_collection: _.throttle(function(e) {
        var el, throttled, value;

        el = e.currentTarget;
        value = $(el).val();

        this.update_collection(value);
    }, 5000),

    update_collection: function(val) {
        var promise, self;
        self = this;
        promise = this.collection.fetch();
        $.when(promise).then(function() {
          console.log('fetched '+val);
        });
    }
});

如果您愿意,您当然可以使用_.debounce。并参阅http://jsfiddle.net/nikoshr/zWrgW/了解演示

答案 1 :(得分:0)

您也可以绑定到更改事件而不是键盘。