Добрый день, коллеги!
Я проектирую простое приложение на основе Layout Browser
http://dev.sencha.com/deploy/ext-4.1...t-browser.html
В системе есть сущности: категории, товары, заказы.
Общий код для создания лайаута находится в отдельном файле и при клике на ветку дерева загружает класс
var m = Ext.create('Catalog.modules.имя_класса');
m.getIndexPanel()
Каждый модуль имеет такую структуру:
Ext.define('Catalog.modules.category', {
getStore: function() {
var me = this;
if (me.store === undefined) {
Ext.define('category', {
extend: 'Ext.data.Model',
fields: ['id', 'name', 'code']
});
me.store = Ext.create('Ext.data.Store', {
model: 'category',
proxy: {
type: 'rest',
url : '/catalog/products/',
reader: {
type: 'json',
root: 'items'
}
},
autoLoad: true,
autoSync: true
});
}
return me.store;
},
getIndexPanel: function() {
var me = this;
me.getStore();
var rowEditing = Ext.create('Ext.ux.grid.plugin.RowEditing', {
clicksToMoveEditor: 1,
autoCancel: false
});
me.grid = Ext.create('Ext.grid.Panel', {
title: 'Категории',
store: me.store,
height: 700,
forceFit: true,
columns: [
{
text: 'Название категории',
dataIndex: 'name',
sortable : true,
editor: {
allowBlank: false
}
},
{
text: 'Код',
dataIndex: 'code',
editor: {
allowBlank: false
}
}
],
viewConfig: {
stripeRows: true
},
tbar: [
{
text: 'Добавить',
iconCls: 'add-item',
handler: function() {
if (rowEditing.editing) return false;
var item = Ext.create('category', {
});
me.store.insert(0, item);
rowEditing.startEdit(0, 0);
}
}, {
itemId: 'remove',
text: 'Удалить',
iconCls: 'remove-item',
handler: function() {
var sm = me.getSelectionModel();
rowEditing.cancelEdit();
Ext.Msg.show({
title: 'Удалить запись?',
msg: 'Вы действительно хотите удалить выделенные записи?',
buttons: Ext.Msg.YESNO,
icon: Ext.Msg.QUESTION,
fn: function (btn){
if (btn === 'yes') {
me.store.remove(sm.getSelection());
me.store.sync();
if (me.store.getCount() > 0) {
sm.select(0);
}
}
}
});
}
},{
text: 'Обновить',
iconCls: 'refresh',
handler: function() {
me.store.load();
}
}],
plugins: [
rowEditing
]
});
return me.grid;
}
});
Модуль товаров:
Ext.define('TourOffice.modules.products', {
getStore: function() {
var me = this;
if (me.store === undefined) {
Ext.define('product', {
extend: 'Ext.data.Model',
fields: ['id', 'category_id', 'name']
});
me.store = Ext.create('Ext.data.Store', {
model: 'product',
proxy: {
type: 'rest',
url : '/catalog/products/',
reader: {
type: 'json',
root: 'items'
}
},
autoLoad: true,
autoSync: true
});
var categories = Ext.create('Catalog.modules.categories');
me.categoriesStore = categories.getStore();
}
return me.store;
},
getIndexPanel: function() {
var me = this;
me.getStore();
var rowEditing = Ext.create('Ext.ux.grid.plugin.RowEditing', {
clicksToMoveEditor: 1,
autoCancel: false
});
// create reusable renderer for categories
Ext.util.Format.comboRenderer = function(combo){
return function(value){
var record = combo.findRecord(combo.valueField, value);
return record ? record.get(combo.displayField) : combo.valueNotFoundText;
}
}
var categoriesCombo = new Ext.form.ComboBox({
typeAhead: true,
triggerAction: 'all',
lazyRender:true,
mode: 'local',
store: me.categoriesStore,
valueField: 'id',
displayField: 'name'
});
me.grid = Ext.create('Ext.grid.Panel', this, {
title: 'Товары',
store: me.store,
height: 700,
forceFit: true,
columns: [
{
text: 'Название товара',
dataIndex: 'name',
sortable : true,
editor: {
allowBlank: false
}
},{
text: 'Категория',
dataIndex: 'category_id',
editor: {
editor: currenciesCombo,
renderer: Ext.util.Format.comboRenderer(categoriesCombo), // pass combo instance to reusable renderer
allowBlank: false
}
}
],
viewConfig: {
stripeRows: true
},
tbar: [
{
text: 'Добавить',
iconCls: 'add-item',
handler: function() {
if (rowEditing.editing) return false;
var item = Ext.create('product', {
});
me.store.insert(0, item);
rowEditing.startEdit(0, 0);
}
}, {
itemId: 'remove',
text: 'Удалить',
iconCls: 'remove-item',
handler: function() {
var sm = me.getSelectionModel();
rowEditing.cancelEdit();
Ext.Msg.show({
title: 'Удалить запись?',
msg: 'Вы действительно хотите удалить выделенные записи?',
buttons: Ext.Msg.YESNO,
icon: Ext.Msg.QUESTION,
fn: function (btn){
if (btn === 'yes') {
me.store.remove(sm.getSelection());
me.store.sync();
if (me.store.getCount() > 0) {
sm.select(0);
}
}
}
});
}
},{
text: 'Обновить',
iconCls: 'refresh',
handler: function() {
me.store.load();
}
}],
plugins: [
rowEditing
]
});
return me.grid;
}
});
Вопрос - правильно ли я планирую структуру модулей?
В товарах есть создание класса категории categoriesStore для того, чтобы в комбобокс в листинге товаров подставилась категория, а не ID.
Прошу подсказать, есть ли недочеты или ошибки, как правильно построить такую структуру?