我有一个集合女巫可以在后端对集合进行分页,所以我在滚动上批量处理另一批项目。我知道服务器上的项目数。我正在寻找一种方法来扩展我的所有收藏getCounter
。这个想法是最初设置服务器计数器,当用户从集合中添加或删除项目时,计数器会更新。什么是最好的方法?
我认为问题在于add
当我从服务器获取新项目时也会触发该事件。否则我只能绑定到add
和remove
事件。
我有一个集合女巫可以在后端对集合进行分页,所以我在滚动上批量处理另一批项目。我知道服务器上的项目数。我正在寻找一种方法来扩展我的所有收藏getCounter
。这个想法是最初设置服务器计数器,当用户从集合中添加或删除项目时,计数器会更新。什么是最好的方法?
我认为问题在于add
当我从服务器获取新项目时也会触发该事件。否则我只能绑定到add
和remove
事件。
您需要控制哪些添加和删除应该计算在内,哪些不计算在内。我想到了两个选择。
将所有不应计入该silent:true
选项的操作静音,并将您的计数器连接到add
,remove
和reset
events。这将对集合的一般使用施加一些限制,因为您不能在所有情况下都使用它们的事件。
覆盖add
,remove
和reset
方法来接受一个额外的选项,它告诉你计数器是否应该更新。就像是:
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 });
(未经测试的代码示例)