在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
答案 0 :(得分:23)
每当模型或集合开始与服务器同步时,a 发出“请求”事件。如果请求成功完成 你会得到一个“同步”事件,如果没有,你会得到一个“错误”事件。
例如,
var C = Backbone.Collection.extend({
url: '/echo/json/'
});
var c = new C();
c.on('sync', function() {
console.log('sync');
});
c.fetch();
答案 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);