2013-05-14 56 views
9

Backbone最新版本(1.0.0版本中有一个新行为,在取回集合后默认不再触发重置事件检测主干集合是否被取回(Backbone 1.0.0)

http://backbonejs.org/#changelog

更名为集合的“更新”设置,并行性与同类 model.set(),并与复位的对比。这是现在是默认更新 机制后取出。如果你想继续使用“复位”,通过 {reset:true}。

的问题是,我想捕捉的事件时,收集已终于取出(很常见的情况,真的!)

我可以听添加,删除和更改事件,但如果集合是空虚我不知道如何赶上事件。

那么,什么是新的,推荐的方式来捕捉何时收集请求已完成,或者它是否通过{reset = true}实现它的唯一方法?

PS:这里是原来的问题,BTW can't catch Backbone Collection reset event

回答

22

Backbone.sync doc

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

例如,

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/

+0

没错,这就是我一直在寻找 – opensas 2013-05-14 22:03:04

10

我们可以通过一种方法是成功的处理程序时,我们就收集调用fetch和你说你只想做一些事情的时候一切[添加,删除,更新或重置]已经发生,你可以在这个成功处理程序中做。

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

注:成功处理程序总是执行,不论你已经通过reset:true与否。无论您的收藏是否为空,它将在所有添加,删除和更新事件发生时的最后一步中调用。

让我知道如果它不能解决您的问题。

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