1

这可能是一些简单的代码,但我不知道原因:

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

这就是为什么我无法触发“重置”,所以我无法获得渲染功能。

4

1 回答 1

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 方法reset: true。但是,即使那样,也可能不会触发事件,因为:

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.

于 2013-11-06T08:27:02.847 回答