ExtJS 4: Modelos com Associações e Lojas
Estou enfrentando um problema de design de aplicativo com oExt.data.Model
classe no ExtJS. Vou tentar desenvolver minhas idéias para um cenário muito comum de loja on-line aqui, para que você possa me seguir. Eu realmente aprecio qualquer comentário sobre meus pensamentos e conclusões!
Suponhamos que você queira mapear o fato de "Cada cliente pode solicitar vários produtos "para ExtJS. Com base nas palavras simples, é possível identificar esses três modelos envolvidos:Customer
, Order
eProduct
. OOrder
neste caso é o que ligaCustomer
areiaProduct
s.
Descobri que o ExtJS realmente permite que você especifique esse(Customer)1-n(Order)1-n(Product)
usando oExt.data.HasManyAssociation
eExt.data.BelongsToAssociation
Aulas. Mas é isso que se quer? Você gostaria que umProduct
sempre pertence a umOrder
? E se você quiser ter uma lista deProduct
sem conexão comOrder
qualquer coisa?
Aqui é onde é mais específico o ExtJS. No ExtJS você temExt.data.Store
s para armazenar todos os seus dados. Para mim, uma maneira natural de organizar meus dados é ter umExt.data.Store
para cada um dos meus modelos:
CustomerStore
OrderStore
ProductStore
Considere ter trêsExt.grid.Panel
lado a lado; um para cada loja. Ao selecionar um cliente em uma grade, seus pedidos são exibidos automaticamente na segunda grade. Ao selecionar um pedido na segunda grade, os produtos associados aparecem na terceira grad
Parece natural para você? Caso contrário, coment
Trazendo tudo juntoEntão agora temos três coisas que precisamos reunir:
Models e seusAssociationshasMany
, belongsTo
) e aData Store
s) É possível definir uma associação apenas de um lado de uma relação Modelo-Modelo? Por exemplo, posso especificar que umOrder
hasMany
Product
s mas deixe de fora queProduct
belongsTo
aOrder
? Porque umProduct
pode realmente pertencer a mais de umOrder
. Portanto, eu especifico que oProduct
modelohasMany
Order
s abaixo.
qui estão os modelos no ExtJ
ClientExt.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 */
});
OrdeExt.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 */
});
ProdutoExt.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'
});
E aqui estão as lojas:
CustomerStoreExt.define('CustomerStore', {
extend : 'Ext.data.Store',
storeId : 'CustomerStore',
model : 'Customer',
proxy : {
type : 'ajax',
url : 'data/customers.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
OrderStoreExt.define('OrderStore', {
extend : 'Ext.data.Store',
storeId : 'OrderStore',
model : 'Order',
proxy : {
type : 'ajax',
url : 'data/orders.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
ProductStoreExt.define('ProductStore', {
extend : 'Ext.data.Store',
storeId : 'ProductStore',
model : 'Product',
proxy : {
type : 'ajax',
url : 'data/products.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
Aqui está um exemplo (não por mim) com empresas e seus produtoshttp: //superdit.com/2011/05/23/extjs-load-grid-from-another-grid. Ele usa dois modelos e duas lojas, mas não há associações definida
Agradeço antecipadament
-Konrad