这可能是一些简单的代码,但我不知道原因:
initialize : function(){
this.offSaleCollection = new Collection.ProductsCollection();
this.offSaleCollection.url = '/products';
this.offSaleCollection.on('reset', this.render, this);
this.offSaleCollection.fetch();
// this.offSaleCollection.reset(); if I do this, the event can be triggered.
},
render: function(){
console.log(this.offSaleCollection);
$('#off-sale-tab .badge').html(this.offSaleCollection.length);
}
这就是我无法触发'重置'的原因,因此我无法获得渲染功能。
答案 0 :(得分:2)
以下是fetch方法的骨干实现:
fetch: function(options) {
options = options ? _.clone(options) : {};
if (options.parse === void 0) options.parse = true;
var success = options.success;
var collection = this;
options.success = function(resp) {
var method = options.reset ? 'reset' : 'set';
collection[method](resp, options);
if (success) success(collection, resp, options);
collection.trigger('sync', collection, resp, options);
};
wrapError(this, options);
return this.sync('read', this, options);
}
因此,如果您在选项中传递reset: true
,则会调用reset方法。但是,即使这样,事件也可能不会被触发,因为:
reset: function(models, options) {
options || (options = {});
for (var i = 0, l = this.models.length; i < l; i++) {
this._removeReference(this.models[i]);
}
options.previousModels = this.models;
this._reset();
models = this.add(models, _.extend({silent: true}, options));
if (!options.silent) this.trigger('reset', this, options);
return models;
}
如果options.silent: true
,则reset
事件未被触发。
所以,我想你应该使用sync
。