Ich habe ein DS.Store
, das das DS.RESTAdapter
und ein ChatMessage
-Objekt verwendet, die als solche definiert sind:
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:
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.
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
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.
Sie können dies auch im Modell-Hook ohne das zusätzliche Durcheinander tun, da der Modell-Hook ein Versprechen direkt akzeptiert:
%Vor%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.
Tags und Links ember.js ember-data