ajax - Backbone : throttle a collection filter event on a View

标签 ajax backbone.js underscore.js

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

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

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但是所有请求都会在等待时间后触发。
我错过了什么?

任何帮助表示赞赏,谢谢!

最佳答案

每次发生 keyup 事件时调用的函数是 filter_collection它本身并没有受到限制,您在其中创建的那个会立即被调用并丢弃。

您应该将您的事件绑定(bind)到一个节流函数:

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/演示

关于ajax - Backbone : throttle a collection filter event on a View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15707681/

相关文章:

javascript - 如何使用 JavaScript 从另一个页面访问元素 id?

python - 如何从 Django 中的 ajax 调用读取文件?

javascript - 如何通过 chrome 控制台访问 Backbone 模型

javascript - 如何在数组中迭代两次

javascript - UnderscoreJS : Getting only top 5 using the _. 每个方法

javascript - 如何在没有 web.xml 的情况下将 AJAX 映射到 servlet

python - 如何在 python 中获取通过 AJAX 发布的值数组?

javascript - 发生滚动事件时防止将鼠标悬停在元素上

javascript - 延迟加载集合时如何获取获取的模型?

javascript - 我想我没有正确使用 Backbone JS 的 View ?