在Backbone.js集合上调用fetch()时会触发哪些事件?

时间:2011-03-10 18:44:52

标签: backbone.js

在我的backbone.js应用中,有一个Trips collection持有Trip models,它与LocalStorage一起使用。我可以致电Trips.create(form_attributes)创建并保存到Todos store的旅程。

首次加载应用时,我致电Trips.fetch({ success: trips_fetch_success })trips_fetch_success收到一条回复,其中显示Trip models所持有的Trips collection

我尝试将refreshchange事件绑定到Trips collection,但这些事件没有被捕获,让我相信我对哪些事件{{1}有错误的想法触发器。

我的问题:应该Trips.fetch触发哪些事件?是在集合上还是在每个Trips.fetch上触发事件?

3 个答案:

答案 0 :(得分:59)

Collection.fetch()会在成功时调用reset,这反过来会触发'重置'事件。集合重置事件的任何订阅者都应该收到该事件。

这里的关键是“成功”。我遇到了这个问题,却发现骨干网正在默默地吞下我的错误信息。传递一个错误处理程序,至少记录到console.log(),看看发生了什么:

trips.fetch({error: function() { console.log(arguments); }});

(注意:旧版本的backbone.js会触发“刷新”而不是“重置”)

答案 1 :(得分:52)

如果您使用的是主干1.0,则需要在fetch()调用中传递reset:true以便与重置事件绑定:

trips.fetch({reset: true});

答案 2 :(得分:20)

从骨干1.0开始,model.fetch()触发'同步'。这就是你应该绑定的东西。

以下是来自backbone.js源的相关部分,其中触发了'sync'事件:

fetch: function(options) {
  options = options ? _.clone(options) : {};
  if (options.parse === void 0) options.parse = true;
  var model = this;
  var success = options.success;
  options.success = function(resp) {
    if (!model.set(model.parse(resp, options), options)) return false;
    if (success) success(model, resp, options);

    // HERE'S THE TRIGGER!
    model.trigger('sync', model, resp, options);

  };
  wrapError(this, options);
  return this.sync('read', this, options);
},