ExtJS 4: Modelos com Associações e Lojas

Introduçã

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!

Models

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 ligaCustomerareiaProduct s.

Associações

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?

Stores

Aqui é onde é mais específico o ExtJS. No ExtJS você temExt.data.Stores 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:

CustomerStoreOrderStoreProductStore

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 junto

Então agora temos três coisas que precisamos reunir:

Models e seusAssociations hasMany, belongsTo) e aData Stores)

É possível definir uma associação apenas de um lado de uma relação Modelo-Modelo? Por exemplo, posso especificar que umOrder hasMany Products mas deixe de fora queProduct belongsTo aOrder? Porque umProduct pode realmente pertencer a mais de umOrder. Portanto, eu especifico que oProduct modelohasMany Orders abaixo.

qui estão os modelos no ExtJ

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 */
});
Orde
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 */
});
Produto
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'
});

E aqui estão as lojas:

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'
        }
    }
});

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

questionAnswers(4)

yourAnswerToTheQuestion