Element zum gefilterten Ergebnis aus Glutendaten hinzufügen

8

Ich habe ein DS.Store , das das DS.RESTAdapter und ein ChatMessage -Objekt verwendet, die als solche definiert sind:

%Vor%

Beachten Sie, dass eine Chat-Nachricht in einem Raum existiert (der Einfachheit halber nicht gezeigt). Daher möchte ich in meinem Chat-Nachrichten-Controller (der Ember.ArrayController erweitert) nur Nachrichten für den Raum laden, in dem sich der Benutzer gerade befindet:

%Vor%

Dies setzt content auf DS.AdapterPopulatedModelArray und meine Ansicht zeigt glücklich alle zurückgegebenen Chat-Nachrichten in einem {{#each}} -Block an.

Jetzt kommt es zum Hinzufügen einer neuen Nachricht, ich habe folgendes im selben Controller:

%Vor%

Dies leitet eine Ajax-Anfrage ein, um die Nachricht auf dem Server zu speichern, alles bisher gut, aber es aktualisiert die Ansicht nicht. Dies ist ziemlich sinnvoll, da es sich um ein gefiltertes Ergebnis handelt. Wenn ich den room_id-Filter in App.store.find entferne, wird er wie erwartet aktualisiert.

Wenn this.pushObject(message) mit dem von App.store.createRecord zurückgegebenen Nachrichteneintrag versucht wird, wird ein Fehler ausgelöst.

Wie füge ich den Artikel manuell zu den Ergebnissen hinzu? Soweit ich das beurteilen kann, scheint es keinen Weg zu geben, da sowohl DS.AdapterPopulatedModelArray als auch DS.FilteredModelArray unveränderlich sind.

    
rlivsey 03.04.2012, 16:38
quelle

3 Antworten

8

so ein paar Gedanken:

(Referenz: Ссылка )

Auf neue Datensätze im Datenspeicher warten

Eine normale Model.find () / findQuery () gibt Ihnen ein AdapterPopulatedModelArray zurück, aber dieses Array wird eigenständig sein ... es wird nicht wissen, dass etwas Neues in die Datenbank geladen wurde

Eine Model.find () ohne params (oder store.findAll ()) gibt Ihnen ALLE Datensätze ein FilteredModelArray zurück, und ember-data wird es in eine Liste "registrieren", und alle neuen Datensätze, die in die Datenbank geladen werden zu diesem Array hinzugefügt werden.

Das Aufrufen von Model.filter (func) gibt Ihnen ein FilteredModelArray zurück, das ebenfalls im Store registriert ist ... und alle neuen Datensätze im Store bewirken, dass ember-data auf "updateModelArrays" verweisen, was bedeutet, dass Ihr Filter aufgerufen wird Funktion mit dem neuen Datensatz, und wenn Sie true zurückgeben, wird es in Ihr bestehendes Array eingefügt.

SO WAS ICH ENDED UP DOING: war sofort nach dem Erstellen des Ladens, ich store.findAll () aufrufen, die mir ein Array aller Modelle für einen Typ zurückgibt ... und ich schließe das an den Laden ... dann irgendwo anders im Code, kann ich ArrayObservers zu diesen Listen hinzufügen .. etwas wie:

%Vor%

So schieben Sie ein Modell in eines dieser "unveränderlichen" Arrays:

Zu beachten: Alle Ember-Datenmodell-Instanzen (Datensätze) haben eine clientId-Eigenschaft ... was eine eindeutige Ganzzahl ist, die das Modell im Datenspeicher-Cache identifiziert, unabhängig davon, ob es ein real hat oder nicht Server-ID noch (Beispiel: direkt nach dem Ausführen eines Model.createRecord).

, so dass das AdapterPopulatedModelArray selbst eine "content" -Eigenschaft hat ... welches ein Array dieser clientId's ist ... und wenn Sie über das AdapterPopulatedModelArray iterieren, führt der Iterator eine Schleife über diese clientId's aus und gibt Ihnen die vollständigen Modellinstanzen (Datensätze) zurück ) diese Karte zu jeder clientId.

SO WAS ICH GESCHAFFEN HABE (Dies bedeutet nicht, dass es "richtig" ist!) ist, diese findAll-Arrays zu beobachten und neue clientId in die content-Eigenschaft des AdapterPopulatedModelArray ... ETWAS:

zu schieben %Vor%

was ich sagen kann ist: "es funktioniert für mich" :) Wird es beim nächsten ember-data update brechen? absolut möglich

    
Nick Franceschina 18.04.2012 20:36
quelle
2

Diejenigen, die noch damit zu kämpfen haben, können sich eine dynamische DS.FilteredArray anstelle einer statischen DS.AdapterPopulatedRecordArray mit der store.filter -Methode besorgen. Es benötigt 3 Parameter : Typ, Abfrage und schließlich ein Filter Rückruf.

%Vor%

Sie können dies auch im Modell-Hook ohne das zusätzliche Durcheinander tun, da der Modell-Hook ein Versprechen direkt akzeptiert:

%Vor%     
tstirrat 02.10.2013 07:54
quelle
0

Das Lesen der Quelle (DS.Store.find) zeigt, dass das, was Sie tatsächlich in dieser Instanz erhalten würden, ein AdapterPopulatedModelArray ist. Ein FilteredModelArray wird beim Erstellen von Datensätzen automatisch aktualisiert. Es gibt bestandene Tests für dieses Verhalten.

    
Christopher Swasey 08.04.2012 17:30
quelle

Tags und Links