在Backbone中,为什么我在执行fetch()时不能触发'reset'事件?

时间:2013-11-06 08:16:16

标签: javascript backbone.js

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

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

这就是我无法触发'重置'的原因,因此我无法获得渲染功能。

1 个答案:

答案 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