Введение
Я сталкиваюсь с проблемой разработки приложения с классом Ext.data.Model
в ExtJS. Я попытаюсь развить свои идеи на очень распространенный сценарий онлайн-магазина здесь, чтобы вы могли следовать за мной. Я был бы очень признателен за любые комментарии к моим мыслям и выводам!
Модели
Предположим, вы хотите сопоставить тот факт, что "каждый клиент может заказать несколько продуктов" в ExtJS. Из голых слов можно определить эти три модели: Customer
, Order
и Product
. Order
в этом случае является тем, что соединяет Customer
и
Product
с.
Ассоциации
Я обнаружил, что ExtJS фактически позволяет вам указать это отношение (Customer)1-n(Order)1-n(Product)
, используя классы Ext.data.HasManyAssociation
и Ext.data.BelongsToAssociation
. Но это то, что нужно? Вы хотите, чтобы a Product
всегда принадлежал Order
? Что делать, если вы хотите иметь список Product
без какого-либо подключения к Order
вообще?
Магазины
Здесь он становится более специфичным для ExtJS. В ExtJS у вас есть Ext.data.Store
для хранения всех ваших данных. Для меня естественным способом организации моих данных является наличие Ext.data.Store
для каждой из моих моделей:
-
CustomerStore
-
OrderStore
-
ProductStore
Подумайте, что у вас есть три Ext.grid.Panel
бок о бок; по одному для каждого магазина. При выборе клиента в одной сетке его заказы автоматически отображаются во второй сетке. При выборе порядка во второй сетке соответствующие продукты появляются в третьей сетке.
Звучит это естественно? Если нет, прокомментируйте!
Объединяя все это
Итак, теперь у нас есть три вещи, которые нам нужно собрать:
- Модели и их
- Ассоциации (
hasMany
,belongsTo
) и - Данные (
Store
s)
Можно ли определить связь только с одной стороны отношения Model-Model? Например, могу ли я указать Order
hasMany
Product
, но не указывать, что a Product
belongsTo
an Order
? Поскольку Product
может принадлежать более чем одному Order
. Поэтому я указываю, что ниже Product
модель hasMany
Order
.
Вот модели в ExtJS:
Клиент
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 */
});
Заказ
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 */
});
Продукт
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'
});
И вот магазины:
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'
}
}
});
Вот пример (не я) с компаниями и их продуктами http://superdit.com/2011/05/23/extjs-load-grid-from-another-grid/. Он использует две Модели и два магазина, но ассоциации не определены.
Заранее благодарю
-Konrad