6

我有一个集合女巫可以在后端对集合进行分页,所以我在滚动上批量处理另一批项目。我知道服务器上的项目数。我正在寻找一种方法来扩展我的所有收藏getCounter。这个想法是最初设置服务器计数器,当用户从集合中添加或删除项目时,计数器会更新。什么是最好的方法?

我认为问题在于add当我从服务器获取新项目时也会触发该事件。否则我只能绑定到addremove事件。

4

1 回答 1

5

您需要控制哪些添加和删除应该计算在内,哪些不计算在内。我想到了两个选择。

  1. 将所有不应计入该silent:true选项的操作静音,并将您的计数器连接到add,removereset events。这将对集合的一般使用施加一些限制,因为您不能在所有情况下都使用它们的事件。

  2. 覆盖add,removereset 方法来接受一个额外的选项,它告诉你计数器是否应该更新。就像是:

    var PaginatedCollection = Backbone.Collection.extend({
    
        initialize: function() {
            this._counter = 0;
        },
    
        add: function(models, options) {
            if(options && options.count)
                this._counter += (_.isArray(models) ? models.length : 1);
            Backbone.Collection.prototype.add.apply(this, arguments);
        },
    
        remove: function(models, options) {
            if(options && options.count)
                this._counter -= (_.isArray(models) ? models.length : 1);
            Backbone.Collection.prototype.remove.apply(this, arguments);         
        },
    
        reset: function(models, options) {
            if(options && options.count)
                this._counter = (_.isArray(models) ? models.length : 0);
            Backbone.Collection.prototype.reset.apply(this, arguments)
        }
    });
    

    并传递count:true选项,当应计算添加或删除的项目时:

    var SomeCollection = PaginatedCollection.extend({ });
    
    var someCollection = new SomeCollection();
    someCollection.add(model, { count: true });
    someCollection.remove(model, { count: true });
    

(未经测试的代码示例)

于 2012-12-19T15:13:04.910 回答