ExtJS 4: Modelle mit Assoziationen und Stores
Einführung
Ich bin vor einer Anwendung design-problem mit der Ext.data.Model
Klasse in ExtJS. Ich werde versuchen zu entwickeln, meine Ideen zu einem sehr gängigen online-Shop-Szenario hier, so Sie können mir Folgen. Ich würde wirklich zu schätzen alle Kommentare über meine Gedanken und Schlussfolgerungen!
Modelle
Nehmen wir an, Sie wollen die Karte der Tatsache, dass "Jeder Kunde kann mehrere Produkte gleichzeitig bestellen" zu ExtJS. Aus dem bloßen Worten kann man sich identifizieren, diese drei Modelle beteiligt: Customer
Order
und Product
. Die Order
in diesem Fall ist das, was verbindet Customer
s und
Product
s.
Verbände
Fand ich, dass ExtJS eigentlich können Sie angeben, dass diese (Customer)1-n(Order)1-n(Product)
Zusammenhang mit der Ext.data.HasManyAssociation
und Ext.data.BelongsToAssociation
Klassen. Aber ist es das, was man will? Würdest du wollen, dass ein Product
gehört immer zu einer Order
? Was ist, wenn Sie möchten, um eine Liste der Product
s ohne jegliche Verbindung zu Order
s auch immer?
Speichert
Dies ist, wo es zu bekommen ist, mehr ExtJS bestimmten. In ExtJS Sie haben Ext.data.Store
s zu halten alle Ihre Daten. Für mich ein natürlicher Weg, um die Organisation meiner Daten ist ein Ext.data.Store
für jedes meiner Modelle:
CustomerStore
OrderStore
ProductStore
Als mit einer drei Ext.grid.Panel
s side-by-side; einen für jede Filiale. Bei der Auswahl eines Kunden in einem Netz, seine Befehle erscheinen automatisch in der zweiten Gitter. Bei der Auswahl einer Bestellung in dem zweiten Gitter und die dazugehörigen Produkte angezeigt, in der Dritten grid.
Klingt das für dich natürlich? Wenn nicht, bitte kommentieren!
Bringen Sie alle zusammen
So, jetzt haben wir drei Dinge, die wir brauchen, zusammen zu bringen:
- Modelle und Ihre
- Verbände (
hasMany
belongsTo
) und die - Daten (
Store
s)
Ist es möglich zu definieren, eine Vereinigung nur von einer Seite des Modell-Modell-relation? Zum Beispiel kann ich angeben, dass ein Order
hasMany
Product
s aber lassen, dass eine Product
belongsTo
eine Order
? Weil ein Product
können gehören eigentlich zu mehr als einem Order
. Also ich angeben, dass die Product
Modell hasMany
Order
s unten.
Hier sind die Modelle in ExtJS:
Kunden
Ext.define('Customer', {
extend : 'Ext.data.Model',
requires : [
'Order',
],
fields : [
{name : 'id', type : 'int'},
{name : 'lastname', type : 'string'}
{name : 'firstname', type : 'string'}
],
hasMany: 'Order' /* Generates a orders() method on every Customer instance */
});
Um
Ext.define('Order', {
extend : 'Ext.data.Model',
fields : [
{name : 'id', type : 'int'},
{name : 'customer_id', type : 'int'}, /* refers to the customer that this order belongs to*/
{name : 'date', type : 'date'}
],
belongsTo: 'Customer', /* Generates a getCustomer method on every Order instance */
hasMany: 'Product' /* Generates a products() method on every Order instance */
});
Produkt
Ext.define('Product', {
extend : 'Ext.data.Model',
fields : [
{name : 'id', type : 'int'},
{name : 'name', type : 'string'},
{name : 'description', type : 'string'},
{name : 'price', type : 'float'}
],
/*
I don't specify the relation to the "Order" model here
because it simply doesn't belong here.
Will it still work?
*/
hasMany: 'Order'
});
Und hier sind die stores:
CustomerStore
Ext.define('CustomerStore', {
extend : 'Ext.data.Store',
storeId : 'CustomerStore',
model : 'Customer',
proxy : {
type : 'ajax',
url : 'data/customers.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
OrderStore
Ext.define('OrderStore', {
extend : 'Ext.data.Store',
storeId : 'OrderStore',
model : 'Order',
proxy : {
type : 'ajax',
url : 'data/orders.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
ProductStore
Ext.define('ProductStore', {
extend : 'Ext.data.Store',
storeId : 'ProductStore',
model : 'Product',
proxy : {
type : 'ajax',
url : 'data/products.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
Hier ist ein Beispiel (nicht von mir) mit Unternehmen und deren Produkte http://superdit.com/2011/05/23/extjs-load-grid-from-another-grid/ . Es verwendet zwei Modelle und zwei Läden, aber es gibt keine Verbände definieren.
Danke im Voraus
-Konrad
InformationsquelleAutor der Frage Konrad Kleine | 2011-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konrad. Ich habe vor kurzem konfrontiert Umgang mit
Models+Associations+Stores
. Das war keine sehr angenehme Erfahrung. Hier ist, was ich gelernt habe:Sagen wir, wir haben Store1, Store2, Model1, Model2, Grid1, Grid2. Grid1 verwendet Store1, Store1 verwendet Model1 und ähnlich Grid2 verwendet, Store2, Store2 verwendet Model2.
So weit alles funktioniert, Daten laden und so weiter.
Aber das wollen wir jetzt hinzufügen
hasMany
Verein zu Model1. Ok, wir fügen Model1 config:Nachdem diese Sie denken, dass Sie können füllen Sie Store2 mit Daten auf Grid1 ist
itemclick
etwas zu tun, wie die folgenden:Erwarten Sie, dass Grid2 ist mit Daten gefüllt, auf Grid1 ist
itemclick
. Aber es passiert nichts. Tatsächlich Anfragen gepostet werden, Antworten zu bekommen. Aber Grid2 ist nicht mit Daten aufgefüllt.Und nach einiger Zeit werden Sie merken, dass
item_which_uses_model1.model2()
IST NICHTStore2
.wenn Model2 "sieht", dass es hat eine Vereinigung mit der Bezeichnung Model1 es creats Model1 eigenen store, die nicht gleich Store2.
Es ist nicht cool, denn Grid2 ist mit Store2.
Tatsächlich können Sie es zu hacken, zum Beispiel, indem auf Grid2 config:
aber was ist, wenn Sie mit ExtJS mvc-Muster. Grid2 doen nicht wissen, etwas über Model1.
Ich nicht empfehlen mit
associations
in realen Projekten. Zumindest jetzt. Sondern stattdessen den Ansatz, die angezeigt wird, in deinem Beispiel: Modell+Store+Filterung.InformationsquelleAutor der Antwort Molecular Man
Alles funktioniert in ExtJS 4, es ist nur schwer zu bekommen gleich beim ersten mal. Gut, die ersten paar Male.
Ja, Sie können, vermeiden Sie die Angabe der belongsTo-Assoziation des Kindes, und immer noch verwenden es in einer Viele-Beziehung.
In meinem Projekt, wir haben Dutzende von Modellen, viele mit tiefen Beziehungen, und es funktioniert Super.
Über Viele-Viele-Beziehungen, sollten Sie entweder
Kunden -< CustomerOrder >- Um
Die drei Modelle,
Oder kann man "schummeln", indem Sie Folgendes tun eine Menge Arbeit auf die server, zu behaupten, dass ein customer-HasMany-Aufträge. Verschachtelte json-hier helfen kann.
InformationsquelleAutor der Antwort Neil McGuigan
ich Stimme voll mit Molekularen Mann. Durch das Lesen der ExtJS Dokumentation erschien es mehr als Beweis, dass dies eine gute route, wenn Sie die Nutzung des Baumes festgelegte Struktur verteilt zu verschiedenen Geschäften. Ehrlich gesagt, ist dies alles wahr sein könnte nur, wenn diese Vereinigung hatte in keiner Weise eine Referenz speichert, um Anrufe zu tätigen. Das ist nicht der Fall von was ich getestet habe. Modell Verbände haben keine solche Beziehung. Filterung ist der beste Weg, um mit sequenziell aktualisieren andere Netze, deren Modelle von anderen abhängen.
InformationsquelleAutor der Antwort flexnroses
Bitte beachten Sie, dass Ihre Annahme:
ist falsch. Ihre eigentliche Modell sein soll:
Das ist, warum Sie finden Sie auch Schwierigkeiten in der Modellierung mit hasMany-belongsTo
InformationsquelleAutor der Antwort Jack