ExtJS 4.1.0ExtJS und Komplexe speichern Operationen
-Update 6/6/13:
ich diese gleiche Frage auf den Sencha Foren gepostet haben, wo es nicht viel Aktion war. Der Beitrag ist mehr oder weniger der gleiche, aber ich dachte, ich würde es hier nur als Referenz hinzufügen. Ich bin immer noch gespannt auf die Beiträge anderer Community-Mitglieder zu einem sehr häufigen Szenario in einer ExtJS-Anwendung! http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
-Update 7/16/13 (Schlussfolgerung?)
Die Sencha Post sammelte sehr wenig Diskussion. Ich habe mich entschieden, den Großteil der Last von komplexen Speicheroperationen auf meinen Anwendungsserver zu legen und Clientspeicher dort, wo es nötig ist, langsam zu aktualisieren. Auf diese Weise kann ich meinen eigenen Datenbank-Wrapper verwenden, um alle Transaktionen abzubilden, die mit einem komplexen Domänenobjekt-Speicher verknüpft sind, um die Atomarität zu gewährleisten. Wenn ein neues Order
gespeichert wird, besteht darin, die Metadaten der Bestellung zu speichern, zehn neue Instanzen von OrderContents
und möglicherweise weitere Informationen (Adressen in anderen Tabellen, ein neuer Kunde zum Zeitpunkt der Auftragserstellung usw.) den Anwendungsserver, anstatt ein vulgäres Netz von Rückrufen im clientseitigen Anwendungscode einzurichten. Daten, die auf einer Eins-zu-eins-Basis zugeordnet sind (z. B. Order
hasOne Address
), werden im success
-Rückruf der Order.save()
-Operation aktualisiert. Komplexere Daten, wie der Inhalt der Order
, werden einfach durch den Aufruf contentStore.sync()
behandelt. Ich glaube, dass dies das Mittel ist Unteilbarkeit ohne eine überwältigende Anzahl von Client-Rückrufe
Original-Beitrag Inhalt
In Anbetracht der insgesamt enttäuschenden Funktionalität des Sparens vereins schweren Modelle zu gewährleisten, habe ich alle aber ditched Modellverknüpfungen in meiner Anwendung und verlassen sich darauf, zugehörige Daten selbst abzurufen. Das ist alles gut und gut, aber leider löst nicht das Problem der tatsächlichen Speicherung der Daten und der Aktualisierung von ExtJS-Speichern, um die Änderungen auf dem Server widerzuspiegeln.
Nehmen Sie zum Beispiel ein Order
Objekt speichern, das aus Metadaten sowie OrderContents
, d. H. Die Teile auf der Bestellung besteht. Die Metadaten landen in einer Order_Data
Tabelle in der Datenbank, während die Inhalte alle in einer Order_Contents
Tabelle enden, in der jede Zeile über eine order_id
Spalte mit der übergeordneten Reihenfolge verknüpft ist.
Auf dem Client ist das Abrufen der Inhalte für eine Bestellung relativ einfach, ohne dass Assoziationen erforderlich sind: var contents = this.getContentsStore().query('order_id', 10).getRange()
. Ein großer Fehler ist jedoch, dass dies auf die Content-Datensätze in der OrderContents
ExtJS Store hingehen, die gelten würde, wenn ich Verknüpfungen verwenden würde NICHT vom Datenserver mit dem "Haupt" -Objekt zurückgegeben.
Beim Speichern einer Bestellung sende ich eine einzelne Anfrage, die die Metadaten der Bestellung (z. B. Datum, Bestellnummer, Lieferanteninformationen usw.) sowie eine Reihe von Inhalten enthält. Diese Daten werden ausgewählt und in den entsprechenden Tabellen gespeichert. Das macht mir genug Sinn und funktioniert gut.
Alles ist gut, bis die gespeicherten/aktualisierten Datensätze vom Anwendungsserver zurückgegeben werden.Da die Anforderung abgefeuert wird, indem ein OrderObject.save()
aufgerufen wird, gibt es nichts, das dem OrderContents
Speicher mitteilt, dass neue Datensätze verfügbar sind. Dies würde automatisch erledigt werden, wenn ich stattdessen Datensätze zum Laden hinzufügen und .sync()
aufrufen würde, aber ich fühle, dass dies den Speichervorgang erschwert und ich würde lieber diese Entkopplung auf dem Anwendungsserver behandeln, ganz zu schweigen von dem Speichern einer gesamten Anforderung auch nett.
Gibt es einen besseren Weg, dies zu lösen? Meine aktuelle Lösung ist wie folgt ...
var orderContentsStore = this.getOrderContentsStore();
MyOrderObject.save({
success: function(rec, op){
// New Content Records need to be added to the contents store!
orderContentsStore.add(rec.get('contents')); // Array of OrderContent Records
orderContentsStore.commitChanges(); // This is very important
}
});
Durch den Aufruf commitChanges()
die in den Laden hinzugefügten Datensätze berücksichtigt werden sauber (nicht-Phantom, nicht schmutzig) sein und somit nicht zurück mehr durch den getModifiedRecords()
Methode des Speichers ; zu Recht, da die Datensätze im Falle einer store.sync()
nicht an den Anwendungsserver übergeben werden sollten.
Dieser Ansatz scheint nur ein bisschen schlampig/Hacky mir, aber ich habe nicht eine bessere Lösung ...
sind Jede Eingabe/Gedanken heraus sehr zu schätzen!
Leider ist dies der einzige Weg, es zu tun. Alternativ könnten Sie Ihren eigenen "Schreiber" auf dem Proxy des Ladens schreiben und die verschiedenen Modelle dort handhaben, aber das wäre auch unordentlich. – Mike
Danke für die Bestätigung meiner Überzeugungen @Mike. Ich werde eines Tages einen Blogpost schreiben und diese Frage mit Informationen aus dem Beitrag beantworten. Ich habe erwogen, eine verrückte Erweiterung für den Data Writer zu implementieren, aber für das, was es erreichen würde (Speichern einer store.load() hier und da), würde ich die zusätzliche Komplexität und Zeit, die für die Implementierung erforderlich ist, nicht wert sein. –