2013-05-14 9 views
9

C'è un nuovo comportamento nella versione più recente di Backbone (1.0.0 in cui l'evento di reset non viene attivato per impostazione predefinita dopo il recupero di una raccolta.rilevare quando una collezione spina dorsale è stata scaricata (Backbone 1.0.0)

http://backbonejs.org/#changelog

"update" di Rinominato Collection per impostare, per il parallelismo con il simile model.set(), e il contrasto con ripristino. e 'ora di default l'aggiornamento meccanismo dopo un recupero. Se si desidera continuare a utilizzare "reset", passare {reset: true}.

Il problema è che voglio catturare l'evento quando la raccolta è stato finalmente recuperato (caso abbastanza comune, anzi!)

ho potuto ascoltare per aggiungere, rimuovere e modificare eventi, ma se la collezione è vuoto Non so come catturare l'evento.

Quindi, quale sarebbe il modo nuovo e consigliato di catturare quando la richiesta di raccolta è stata finalizzata, o sta passando {reset = true} l'unico modo per raggiungerlo ???

ps: ecco la domanda iniziale, BTW can't catch Backbone Collection reset event

risposta

22

Da Backbone.sync doc,

Ogni volta che un modello o di raccolta inizia una sincronizzazione con il server, una "richiesta" evento viene emesso. Se la richiesta viene completata con successo , si verificherà un evento di "sincronizzazione" e un evento di "errore" in caso contrario.

Per esempio,

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

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

e una demo http://jsfiddle.net/nikoshr/GLATm/

+0

sì, questo è quello che cercavo – opensas

10

possiamo passare un metodo come un gestore di successo quando chiamiamo fetch sulla raccolta e, come hai detto che vogliamo solo fare qualcosa quando tutto ciò che è [aggiungere, rimuovere, aggiornare o ripristinare] è accaduto, puoi farlo all'interno di questo gestore di successo.

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

Nota: handler successo viene sempre eseguito indipendentemente aver superato reset:true o meno. Indipendentemente dal ritiro della raccolta, questa verrà richiamata all'ultimo passaggio quando si sono verificati tutti gli eventi di aggiunta, rimozione e aggiornamento.

Fammi sapere se non risolve il tuo problema.

0

La mia soluzione è davvero piuttosto semplice. Ho già una BaseCollection con funzionalità aggiunte, quindi ho impostato come predefinito {reset: true}. Il codice dovrebbe essere qualcosa come questo (il mio BaseCollection ha un sacco di cose che non è pertinente qui):

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

Utilizzando promesse ...

// 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); 
Problemi correlati