2013-03-09 9 views
8
loadMore: function(){ 
    var $this = this; 
    console.log(this.Messages); //SAME AS AFTER 
    this.Messages.url = '/js/messages/?start=' + this.Messages.length 
    this.Messages.fetch({'add':true, 
     success:function(){ 
      console.log($this.Messages); //SAME AS BEFORE?? 
     }, 
     error:function(){ 
     } 
    }); 
}, 

La raccolta non viene aggiornata. Dopo questa funzione, gli eventi vengono attivati ​​e i nuovi elementi vengono disegnati sullo schermo. Il problema è che la collezione non ha aggiunto i nuovi modelli.Recupero raccolta backbone (aggiungi: true) non aggiorna la raccolta

+0

Hai verificato che i dati vengano effettivamente restituiti nella chiamata get? – kinakuta

+0

Stai solo cercando i nuovi modelli aggiunti in '$ this.Messages' all'interno del callback' success'? In tal caso, sei sicuro che, quando viene chiamato 'successo', la raccolta avrebbe già analizzato la risposta e aggiunta alla raccolta? –

risposta

0

Backbone.Collection.fetch():

fetch: function(options) { 
    options = options ? _.clone(options) : {}; 
    if (options.parse === void 0) options.parse = true; 
    var success = options.success; 
    options.success = function(collection, resp, options) { 
    var method = options.update ? 'update' : 'reset'; 
    collection[method](resp, options); 
    if (success) success(collection, resp, options); 
    }; 
    return this.sync('read', this, options); 
}, 

Allora che succede qui è, il tuo passato in funzione è assegnata a var succees.
collection[method](resp, options); Viene chiamato e nel tuo caso il metodo è 'reset'.
collection.reset deve passare e aggiungere tutti i modelli, attivare tutti gli eventi in corso. Non so esattamente cosa sta succedendo ma passa attraverso lo collection.reset, lo collection.add, lo model.add, ecc. Non ho seguito tutto.

Non sono sicuro di quale sia il problema, mi dispiace. Spero di poter almeno aiutarti a provare alcune cose, quindi forse possiamo capirlo. La linea if (success) success(collection, resp, options) è la chiamata alla funzione di successo. Che cosa si potrebbe provare a fare è avere il callback successo accettare gli argomenti passati indietro e fare un po 'consolante di quelli fuori:

success: function(collection, resp, options) { 
    console.log(collection); // this might do the trick. 

    // if not, you could try the following 
    collection.on("reset", function(c, options) { 
    console.log(c); // see what that gives ya. 
    }); 
} 

Un'altra cosa è, non riuscivo a trovare in qualsiasi parte del sorgente o la documentazione in cui collection.fetch prende un'opzione di aggiunta. Se mi manca, per favore fammi sapere che mi piacerebbe dare un'occhiata.

Buona fortuna, fammi sapere cosa trovi. Potrebbe valere la pena seguire anche un debugger.

Cazzo, mi sembra anche che la console mi abbia spesso mostrato la versione più aggiornata degli oggetti di raccolta quando non avrebbe dovuto.

provare consolando le lunghezze delle collezioni invece o qualcosa del genere:

var len = $this.Messages.length; 
console.log(len); 


//... 
// or in the success callback 
var len = collection.length; 
console.log(len); 
0

Backbone 1.0 rimuove questa funzione, rompendo il codice che dipende da questo:

http://backbonejs.org/#Collection-fetch

Confronta con:

"Se desideri aggiungere i modelli in arrivo alla raccolta corrente, invece di sostituire i contenuti della raccolta, pas s {aggiungi: true} come opzione da recuperare. "

http://htmlpreview.github.com/?https://raw.github.com/documentcloud/backbone/0.9.2/index.html#Collection-fetch

suggerisco Ripristino di una versione precedente di Backbone fino a quando questo problema è stato risolto.

21

Come è stato menzionato in una risposta precedente, l'opzione add è stata rimossa in 1.0.0. Puoi ottenere la stessa cosa passando remove: false. Dal docs:

Il comportamento di recupero può essere personalizzato utilizzando il set a disposizione opzioni.Ad esempio, per andare a prendere una collezione, ottenendo un "add" evento per ogni nuovo modello, e un evento di "cambiamento" per ogni cambiato modello esistente, senza togliere nulla: collection.fetch({remove: false})

0

nella spina dorsale 1.0, è necessario per attivare il ripristino a mano:

youColloection.fetch({reset: true}); 
Problemi correlati