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: CustomerOrderund Product. Die Order in diesem Fall ist das, was verbindet Customers und
Products.

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 Products ohne jegliche Verbindung zu Orders auch immer?

Speichert

Dies ist, wo es zu bekommen ist, mehr ExtJS bestimmten. In ExtJS Sie haben Ext.data.Stores 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:

  1. CustomerStore
  2. OrderStore
  3. ProductStore

Als mit einer drei Ext.grid.Panels 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:

  1. Modelle und Ihre
  2. Verbände (hasManybelongsTo) und die
  3. Daten (Stores)

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 Products 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 Orders 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

Schreibe einen Kommentar