检测何时获取主干集合(Backbone 1.0.0)

时间:2013-05-14 08:26:12

标签: backbone.js backbone-collections

在Backbone的最新版本中有一个新行为(1.0.0,在获取集合后,默认情况下不会再触发重置事件。

http://backbonejs.org/#changelog

  

重命名Collection的“更新”以设置,与类似的并行   model.set(),与reset对比。它现在是默认更新   获取后的机制。如果您想继续使用“重置”,请通过   {reset:true}。

问题是我想在最终获取集合时捕获事件(确实非常常见!)

我可以听取添加,删除和更改事件,但如果集合为空,我不知道如何捕获事件。

那么,当收集请求最终确定时,新的,推荐的捕获方式是什么,或者它是否通过{reset = true}实现它的唯一方法???

ps:这是原始问题,BTW can't catch Backbone Collection reset event

4 个答案:

答案 0 :(得分:23)

来自Backbone.sync doc

  

每当模型或集合开始与服务器同步时,a   发出“请求”事件。如果请求成功完成   你会得到一个“同步”事件,如果没有,你会得到一个“错误”事件。

例如,

var C = Backbone.Collection.extend({
    url: '/echo/json/'
});

var c = new C();
c.on('sync', function() {
    console.log('sync');
});
c.fetch();

演示http://jsfiddle.net/nikoshr/GLATm/

答案 1 :(得分:10)

当我们在集合上调用fetch时,我们可以将方法作为成功处理程序传递,正如您所说的那样,当您添加,删除,更新或重置所有内容时,您只想执行某些操作,您可以在内部执行这个成功的处理程序。

collection.fetch({
  success: function() {
    // Do Something
    // This is called when all add, remove and update operations have been done
  }
});

注意:无论您是否通过reset:true,都会执行成功处理程序。无论您的集合是否为空,当所有添加,删除和更新事件都发生时,它将在最后一步调用。

如果它无法解决您的问题,请告诉我。

答案 2 :(得分:0)

我自己的解决方案确实非常简单。我已经有一个添加了功能的BaseCollection,所以在那里我只设置为default {reset:true}。代码应该是这样的(我自己的BaseCollection有很多与此无关的东西):

var BaseCollection = Backbone.Collection.extend({
  fetch: function(options) {
    options = options || {};
    options.reset = (options.reset === undefined ? true : options.reset);
    // just call super.fetch
    return Backbone.Collection.fetch.call(this, options);
  };
});     

答案 3 :(得分:0)

使用承诺......

// you could use promises as well
// P.S.: pardon jquery promises :)

var C = Backbone.Collection.extend({
    url: '/echo/json/'
});

var c = new C();

// c.fetch() returns jqXHR object that you can listen too
$.when( c.fetch() )
   .done(successFn)
   .fail(failFn)
   .always(alwaysFn);