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!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage