Introduction
Je suis face à une demande problème de conception de l' Ext.data.Model
de la classe dans ExtJS. Je vais essayer de développer mes idées à un très commune de la boutique en ligne de scénario ici, donc vous pouvez me suivre. Je voudrais vraiment apprécier tous les commentaires sur mes pensées et mes conclusions!
Modèles
Supposons que vous souhaitez mapper le fait que "Chaque client peut commander plusieurs produits" pour ExtJS. À partir des mots nus, on peut identifier ces trois modèles concernés: Customer
, Order
, et Product
. L' Order
dans ce cas, est ce qui relie Customer
s et
Product
s.
Les Associations
J'ai trouvé que ExtJS vous permet de spécifier ce (Customer)1-n(Order)1-n(Product)
rapport à l'aide de l' Ext.data.HasManyAssociation
et Ext.data.BelongsToAssociation
les classes. Mais est-ce ce que l'on veut? Voudriez-vous qu'un Product
appartient toujours à un Order
? Que faire si vous voulez avoir une liste d' Product
s sans aucune connexion à Order
s que ce soit?
Magasins
C'est là que c'est plus ExtJS spécifiques. Dans ExtJS vous avez Ext.data.Store
s pour contenir toutes vos données. Pour moi un moyen naturel pour organiser mes données est d'avoir un Ext.data.Store
pour chacun de mes modèles:
CustomerStore
OrderStore
ProductStore
Envisager d'avoir un trois Ext.grid.Panel
s side-by-side, une pour chaque magasin. Lors de la sélection d'un client dans une grille, ses commandes s'affichent automatiquement dans la deuxième grille. Lors de la sélection d'une commande dans la deuxième grille, les produits associés figurent dans la troisième grille.
Est-ce son naturel pour vous? Si non, s'il vous plaît commentaire!
Réunissant tout
Alors maintenant, nous avons trois choses que nous devons réunir:
- Les modèles et leurs
- Associations (
hasMany
,belongsTo
) et la - De données (
Store
s)
Est-il possible de définir une association seulement d'un seul côté d'un Modèle-Modèle de relation? Par exemple, je peux préciser qu'un Order
hasMany
Product
s, mais laisser qu'un Product
belongsTo
un Order
? Parce qu'un Product
pouvez réellement appartenir à plus d'un Order
. Donc je précise que l' Product
modèle hasMany
Order
s ci-dessous.
Ici, ce sont les modèles en ExtJS:
Client
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 */
});
Afin
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 */
});
Produit
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'
});
Et voici les magasins:
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'
}
}
});
Voici un exemple (pas par moi) avec les entreprises et leurs produits http://superdit.com/2011/05/23/extjs-load-grid-from-another-grid/ . Il utilise deux Modèles et deux magasins, mais il n'y a pas d'associations définir.
Je vous remercie à l'avance
-Konrad