ExtJS und komplexe Speichervorgänge
ExtJS 4.1.0
Update 06.06.13:
Ich habe die gleiche Frage in den Sencha-Foren gepostet, in denen nicht viel los war. Der Beitrag ist mehr oder weniger derselbe, aber ich dachte, ich würde ihn hier nur als Referenz hinzufügen. Ich bin immer noch gespannt auf die Beiträge anderer Community-Mitglieder zu dem Szenario, das in einer ExtJS-Anwendung sehr verbreitet sein muss!http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
Update 16.07.13 (Fazit?)
Die Sencha-Post sorgte für wenig Diskussion. Ich habe mich entschlossen, den Großteil der komplexen Speichervorgänge auf meinen Anwendungsserver zu übertragen und Client-Stores bei Bedarf zu aktualisieren. Auf diese Weise kann ich meinen eigenen Datenbank-Wrapper verwenden, um alle Transaktionen zu erfassen, die mit einem komplexen Domänenobjekt verknüpft sind, um die Atomizität zu gewährleisten. Beim Speichern eines neuenOrder
besteht aus dem Speichern der Auftragsmetadaten, zehn neue Instanzen vonOrderContents
und möglicherweise andere Informationen (Adressen, die sich in anderen Tabellen befinden, ein neuer Kunde, der zum Zeitpunkt der Auftragserstellung definiert wurde, usw.). Ich würde die Nutzdaten lieber an den Anwendungsserver senden, als in der clientseitigen Anwendung ein vulgäres Netz von Rückrufen einzurichten Code. Daten, die eins zu eins zugeordnet sind (z. B. einOrder
hasOneAddress
) wird im aktualisiertsuccess
Rückruf derOrder.save()
Operation. Komplexere Daten wie dieOrder
's Inhalt wird faul per einfachem Aufruf gehandhabtcontentStore.sync()
. Ich bin der Meinung, dass dies das Mittel ist, um Atomizität ohne eine überwältigende Anzahl von Kundenrückrufen zu gewährleisten
Ursprünglicher Beitragsinhalt
Angesichts der insgesamt enttäuschenden Funktionalität beim Speichern von Modellen mit hohem Assoziationsgrad habe ich die Modellassoziationen in meiner Anwendung so gut wie aufgegeben und bin darauf angewiesen, die zugehörigen Daten selbst abzurufen. Das ist alles in Ordnung und gut, löst aber leider nicht das Problem, die Daten tatsächlich zu speichern und ExtJS-Speicher zu aktualisieren, um die Änderungen auf dem Server widerzuspiegeln.
Nehmen wir zum Beispiel das Speichern einesOrder
Objekt, das sowohl aus Metadaten als auch ausOrderContents
d.h. die Teile auf der Bestellung. Die Metadaten landen in einemOrder_Data
Tabelle in der Datenbank, während die Inhalte alle in einemOrder_Contents
Tabelle, in der jede Zeile mit der übergeordneten Bestellung über ein verknüpft istorder_id
Säule.
Das Abrufen der Inhalte für eine Bestellung ist auf dem Client ganz einfach, ohne dass Verknüpfungen erforderlich sind:var contents = this.getContentsStore().query('order_id', 10).getRange()
. Ein Hauptfehler ist jedoch dasDies hängt von den Inhaltsdatensätzen ab, die im Internet verfügbar sindOrderContents
ExtJS StoreDies würde zutreffen, wenn ich Verknüpfungen verwende, die NICHT vom Datenserver mit dem "Haupt" -Objekt zurückgegeben werden.
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 getrennt und in den entsprechenden Tabellen gespeichert. Das macht für mich Sinn und funktioniert gut.
Alles ist in Ordnung, bis gespeicherte / aktualisierte Datensätze vom Anwendungsserver zurückgegeben werden. Da die Anfrage durch einen Aufruf von a ausgelöst wirdOrderObject.save()
gibt es nichts zu sagenOrderContents
Speichern Sie, dass neue Datensätze verfügbar sind. Dies würde automatisch erledigt, wenn ich stattdessen Datensätze zum Geschäft hinzufügen und anrufen würde.sync()
, aber ich denke, dies erschwert den Speichervorgang und ich würde diese Entkopplung auf dem Anwendungsserver viel lieber behandeln, ganz zu schweigen davon, dass das Speichern einer gesamten Anfrage auch ganz nett ist.
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 einen AnrufcommitChanges()
Die dem Geschäft hinzugefügten Datensätze gelten als sauber (nicht durchsichtig, nicht schmutzig) und werden daher von den Geschäften nicht mehr zurückgegebengetModifiedRecords()
Methode; Zu Recht, da die Datensätze im Falle einer. nicht an den Anwendungsserver weitergegeben werden solltenstore.sync()
.
Dieser Ansatz scheint mir nur ein bisschen schlampig zu sein, aber ich habe keine bessere Lösung gefunden ...
Jede Eingabe / Gedanken sind sehr dankbar!