【问题标题】:Backbone collection counter骨干收集计数器
【发布时间】:2012-12-19 23:13:04
【问题描述】:

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

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

【问题讨论】:

  • 在用于从集合中添加/删除项目的方法的回调中创建某种计数器缓存
  • 但是我必须为每一种收藏都这样做。我正在寻找类似计数器扩展的东西。
  • 所以写一个可以保留所有你想保留的计数器的mixin。你需要把它保存在某个地方。

标签: javascript backbone.js


【解决方案1】:

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

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

  2. 覆盖addremovereset 方法 以接受一个额外的选项,该选项告诉您是否应该更新计数器。比如:

    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 });
    

(未经测试的代码示例)

【讨论】:

  • 对不起,我认为这根本不是一个好习惯。为这种目的扩展自然函数,主要是在你自己的代码中对我来说听起来很丑 - 将你的业务规则与架构设计混合并不是最好的方法。今天,我们的听众可以为我们智能地处理这种行为......this.listenTo(this.collection, 'add', this.increment) 是我们可以轻松管理这个问题的一个例子。是的,我知道我们是在 2014 年,Backbone 现在已经更新,但我将其发布为未来的学徒和参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多