2013-03-09 2 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(){ 
     } 
    }); 
}, 

Die Sammlung wird nicht aktualisiert. Nach dieser Funktion werden die Ereignisse ausgelöst und die neuen Objekte werden auf dem Bildschirm gezeichnet. Das Problem ist, dass die Sammlung die neuen Modelle nicht hinzugefügt hat.Backbone-Sammlung fetch (add: true) aktualisiert die Sammlung nicht

+0

Haben Sie verifiziert, dass die Daten tatsächlich im get-Aufruf zurückgegeben werden? – kinakuta

+0

Suchen Sie nur nach den neu hinzugefügten Modellen in '$ this.Messages' im' success' Callback? Wenn ja, sind Sie sicher, dass, wenn 'success' aufgerufen wird, die Sammlung die Antwort bereits geparst und zur Sammlung hinzugefügt hätte? –

Antwort

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

Was ist also hier oben ist, sie in Funktion übergeben wird var succees zugeordnet.
collection[method](resp, options); Ist aufgerufen und in Ihrem Fall ist die Methode 'reset'.
collection.reset muss gehen und alle Ihre Modelle hinzufügen, feuern alle Ereignisse auf dem Weg. Ich weiß nicht genau, was passiert, aber es geht durch collection.reset, collection.add, model.add, etc ... Ich habe es nicht alles folgen.

Ich bin mir nicht sicher, was das Problem genau ist, tut mir leid. Ich hoffe, ich kann dir wenigstens helfen, einige Dinge auszuprobieren, vielleicht können wir es herausfinden. Die Zeile if (success) success(collection, resp, options) ist der Aufruf Ihrer Erfolgsfunktion. Was Sie könnten versuchen, zu tun ist Ihr Erfolg Rückruf der übergebenen zurück Argumente Kauf nehmen zu müssen und einige tröstend die tun out:

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

Eine andere Sache ist, ich konnte nicht überall in der Quelle oder die Dokumentation, wo collection.fetch finden nimmt eine Add-Option. Wenn ich es verpasst habe, lass es mich wissen, ich würde es gerne sehen.

Viel Glück, lassen Sie mich wissen, was Sie finden. Es könnte sich auch lohnen, einen Schritt durch den Debugger zu machen.

Scheiße, es scheint mir auch, dass Konsole hat mir oft die aktuellste Version von Sammlungsobjekten gezeigt, wenn es nicht haben sollte.

versuchen, die Längen der Sammlungen statt oder etwas tröstlich aus:

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


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

Backbone 1.0 entfernt diese Funktion, Code zu brechen, die davon abhängt:

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

Vergleichen mit:

"Wenn Sie die eingehenden Modelle zur aktuellen Sammlung hinzufügen möchten, statt den Inhalt der Sammlung zu ersetzen, pas s {add: true} als Option zum Abrufen. "

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

Ich schlage vor, auf eine ältere Version von Backbone zurückkehrt, bis dieses Problem behoben ist.

21

Wie in einer früheren Antwort erwähnt, wurde die Option add in 1.0.0 entfernt. Sie können dasselbe erreichen, indem Sie stattdessen remove: false übergeben. Vom docs:

Das Verhalten holen kann durch die Verwendung des zur Verfügung stehenden Satz Optionen angepasst werden.Um zum Beispiel eine Sammlung zu holen, jedes neue Modell ein „add“ Ereignis für immer, und ein „change“ -Ereignis für jede geändert bestehende Modell, ohne etwas zu entfernen: collection.fetch({remove: false})

0

in Backbone 1.0, haben Sie um das Zurücksetzen per Hand auszulösen:

youColloection.fetch({reset: true});