Javascript 主干收集计数器

Javascript 主干收集计数器,javascript,backbone.js,Javascript,Backbone.js,我有一个可以在后端对一个集合进行分页的集合,所以onscroll我会对另一批项目进行排序。我知道服务器上的项目数。我正在寻找一种通过getCounter方法扩展我所有收藏的方法。其思想是最初设置服务器计数器,当用户从集合中添加或删除项目时,计数器将更新。什么是最好的方法 我认为问题在于,当我从服务器获取新项目时,add事件也会被触发。否则,我可以只绑定到add和remove事件。您需要控制哪些添加和删除应该计数,哪些不应该计数。我想到了两个选择 使用silent:true选项使所有不应计数的操作

我有一个可以在后端对一个集合进行分页的集合,所以onscroll我会对另一批项目进行排序。我知道服务器上的项目数。我正在寻找一种通过
getCounter
方法扩展我所有收藏的方法。其思想是最初设置服务器计数器,当用户从集合中添加或删除项目时,计数器将更新。什么是最好的方法


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

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

  • 使用
    silent:true
    选项使所有不应计数的操作静音,并将计数器连接到
    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 });
    

  • (代码示例未经测试)

    在用于从集合中添加/删除项的方法的回调中创建某种计数器缓存,但我必须为每种集合执行此操作。我正在寻找类似计数器扩展的东西。因此,编写一个mixin,它可以保留所有您想要保留的计数器。你需要把它放在某个地方。很抱歉撞到你了,但我认为这根本不是一个好的做法。为了这种目的而扩展自然功能,主要是在自己的代码中,这听起来很难听——将业务规则与架构设计结合起来并不是最好的方法。今天,我们的听众可以聪明地为我们处理这些行为
    this.listenTo(this.collection'add',this.increment)
    就是一个例子,说明我们可以多么容易地处理这个问题。是的,我知道我们是在2014年,主干现在是更新的,但我发布这个给未来的学徒和参考。