Backbone.js集合大小 - 如果达到限制,则不显示

时间:2015-07-09 03:07:07

标签: backbone.js backbone-collections

我的Backbone Collection中有以下代码

    loadMore: function() {
        this.offset += 1;
        this.fetch({
            data: {
                limit: 50,
                skip: this.offset
            },
            remove: false,
            success: function(collection) {
                var collectionSize = collection.length;

                console.log(collectionSize);

                if (collectionSize < this.sizeLimit) {
                    this.add(collection);
                } else {
                    eventer.trigger('products:end');
                }
            }.bind(this)
        });
    }

this.sizeLimit被硬编码(用于测试)到150,但即使collectionSize增长超过限制,产品也会继续添加到集合中。

2 个答案:

答案 0 :(得分:2)

这是因为fetch会在成功回调之前自动将结果添加到您的收藏中。

请参阅https://github.com/jashkenas/backbone/blob/master/backbone.js#L1002

fetch: function(options) {
  options = _.extend({parse: true}, options);
  var success = options.success;
  var collection = this;
  options.success = function(resp) {
    var method = options.reset ? 'reset' : 'set';
    collection[method](resp, options);
    if (success) success.call(options.context, collection, resp, options);
    collection.trigger('sync', collection, resp, options);
  };
  wrapError(this, options);
  return this.sync('read', this, options);
},

它保存了对您发送的成功回调的引用,但随后运行了自己的成功回调,该回调执行collection.set(如果传入了该选项,则为reset),其中包含服务器结果调用你传入的那个。

可以通过清空集合来启动你的成功回调,然后添加任意数量的模型,但这会产生许多unnessescary事件。根据为什么您希望拥有此限制,您可以更好地自行执行AJAX请求,而无需使用Backbone的Sync或在其他地方实施限制,例如在渲染时。

答案 1 :(得分:2)

像ivarni一样,Backbone将在解析后自动将所有模型添加到集合中。但是如果你覆盖了解析方法,你就可以抛弃不必要的项目:

parse: function(data){
  return data.slice(0, this.sizeLimit);
}