我的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
增长超过限制,产品也会继续添加到集合中。
答案 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);
}