2013-06-13 5 views
5

Ich verwende den lokalen Backbone-Speicher und erlebe seltsames Verhalten.Das neu gespeicherte Backbone-Modell wird nach dem Abruf nicht in der Sammlung angezeigt.

Ich habe ein Modell, und Sammlung, die definiert ist, instanziiert und hergeholt:

MyModel = Backbone.Model.extend({ 
     localStorage: new LocalStore('example-myModels') 
     //note: LocalStore = Backbone.LocalStore -> https://github.com/jeromegn/Backbone.localStorage 
}); 

MyCollection = Backbone.Collection.extend({ 
     model : MyModel, 
     localStorage: new LocalStore('example-myModels') 
}); 

var myCollection = new MyCollection(); 
myCollection.fetch(...); 

Diese Sammlung dann als eine Liste an den Benutzer angezeigt wird. Der Benutzer kann auf „add“ ein Element in die Sammlung, die schließlich in diesem Code führt:

var newModel = new MyModel(); 
newModel.save(newModelAttributes, { 
    success: function(newlySavedModel) { 
     myCollection.add(newlySavedModel); 
    } 
); 

An diesem Punkt myCollection hat das neu hinzugefügte Modell und ich die Platte erfolgreich in meiner localstorage-Datenbank erstellt sehen:

Pre-Save Localstorage:

enter image description here

Post speichern Localstorage:

enter image description here

Der nächste Schritt, nachdem der Benutzer fügt der Datensatz zurück in die Liste zu gehen, bei dem die Sammelstelle wieder abgerufen wird:

myCollection.fetch(); 

Jetzt myCollection nicht mehr enthält der neue Datensatz. Egal, wie oft ich abrufe, der neue Datensatz wird nicht abgerufen - obwohl ich ihn in meiner localStorage-Datenbank sehen kann. Ich habe auch versucht, eine neue Instanz der Collection zu erstellen und diese zu holen, aber es liefert die gleichen Ergebnisse. Wenn ich den Browser neu lade, erscheint der neue Datensatz wie erwartet. Hat jemand eine Idee was los ist? Ich habe das Gefühl, ich grundlegende hier etwas fehlt bin ...

Ein laufendes Beispiel, das das Problem reproduziert hier verfügbar: http://jsbin.com/iyorax/2/edit (stellen Sie sicher, dass die Konsole sichtbar ist und klicken Sie auf „Run mit JS“)

Danke voraus!

+1

Ist der neue Datensatz vorhanden, wenn Sie 'myCollection.fetch ({reset: true});'? –

+1

kein Glück mit "reset: true" :( – moliveira

+0

Funktioniert dies in Js Geige? Kann helfen, zu replizieren und zu diagnostizieren – prototype

Antwort

4

Ihr Modell und Ihre Sammlung benötigen einen Verweis auf die gleiche Instanz von LocalStor zu teilen, während gerade jetzt zwei verschiedene Objekte zu schaffen. Um dies zu beheben, erstellen Sie das LocalStore-Objekt außerhalb eines Modells oder einer Sammlung und übergeben Sie einen Verweis darauf in den Konstruktoren Ihres Modells und Ihrer Sammlung.

+0

Das hat es geschafft, danke! – moliveira

+2

Also alles funktioniert jetzt aber ich bin ein bisschen mit dabei nfused über die Funktionsweise von LocalStorage. Auch wenn ich nach dem Speichern eines Modells eine * neue * Sammlung instanziiere, erscheint das neue Modell nicht in meiner neuen Sammlung (http://jsbin.com/iyorax/11/edit). Es * erscheint * jedoch beim erneuten Laden der Seite. Ich verstehe, dass ich mehrere Instanzen von Backbone.LocalStorage in meinen Modellen haben würde, aber ich erwarte, dass sie von einem gemeinsamen persistenten Speicher unterstützt werden. Was vermisse ich? – moliveira

1

Ich habe eine Anwendung mit Backbone.localstorage arbeiten und was für mich ist ich zuerst das Modell auf die Sammlung und dann rufe ich zum Modell speichern. so was.

var newModel = new MyModel(); 
myCollection.add(newModel) 
newModel.save(); 

Im nicht 100% sicher, aber meine Argumentation ist, dass wird Ihr Modell gespeichert, aber Ihre Sammlung ist nicht, und vielleicht wird ein Index nicht aktualisiert wird und zu der Zeit, die Sie rufen Sie holen bekommen die nicht aktualisierte Sammlung.

Hoffe, dass hilft.

+0

Danke! Das schien wirklich vielversprechend! Leider habe ich es einfach ausprobiert und kein Glück. Das Verhalten ist genau das selbe, wo die Sammlung die richtige Anzahl von Elementen enthält, nachdem ich sie addiere() aber wenn ich lese Das hinzugefügte Element. Etwas über Fetch erfasst die an LocalStorage vorgenommenen Änderungen erst, nachdem die Seite neu geladen wurde. – moliveira

0

Der einzige Grund, warum ich von Grund denken kann, auf dem das Modell nicht in der Sammlung ist wegen duplizierte IDs

Ich sehe nicht ein IdAttribute auf dem Modell definiert. Das könnte manchmal ein Problem sein.

+0

Danke! Ich habe einige Screenshots von meiner LocalStorage zur obigen Frage hinzugefügt. Ich kann nichts falsches mit den IDs sehen, aber lass es mich wissen wenn irgendwas ausschaut – moliveira

Verwandte Themen