10

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

http://backbonejs.org/#changelog

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

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

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

那么,当收集请求完成时,新的推荐方法是什么,或者它是否传递 {reset = true} 是实现它的唯一方法???

ps:这是原始问题,顺便说一句,无法捕获 Backbone Collection 重置事件

4

4 回答 4

23

Backbone.sync 文档

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

例如,

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/

于 2013-05-14T08:39:42.497 回答
10

当我们调用集合时,我们可以将方法作为成功处理程序传递fetch,正如您所说,您只想在所有事情[添加、删除、更新或重置]发生时做某事,您可以在此成功处理程序中执行操作。

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

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

让我知道它是否不能解决您的问题。

于 2013-05-14T16:38:57.400 回答
0

我自己的解决方案确实很简单。我已经有一个带有附加功能的 BaseCollection,所以在那里我只是设置为默认值 { 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);
  };
});     
于 2013-05-15T03:13:28.030 回答
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);
于 2015-01-07T00:44:35.810 回答