2014-02-06 3 views
1

Я разработал страницу с одним хранилищем и сеткой для отображения элементов из запроса базы данных. С тех пор краткое изложение расширилось, чтобы охватить динамическую группировку элементов в сетке с помощью перетаскивания.Динамическое создание нескольких магазинов Sencha ExtJS из одного магазина

Было решено, что реализация этой функциональности будет выполняться путем создания на стороне клиента нескольких хранилищ и сеток, так что один запрос GET предоставляет все записи для сетки (ов).

Когда загружено начальное «основное хранилище», функция загрузки загружается через данные в «мастер-магазине» и создает новые магазины (вычерчивание вишней записей для указанного магазина) и новую сетку для каждого магазина , Сетки будут иметь динамически генерируемые заголовки из содержимого, но будут иметь простые идентификаторы для обозначения групп в базе данных.

Пользователь затем перетаскивает и удаляет элементы из каждой сетки в другие сетки по мере необходимости, удаляя элемент из «старого» магазина и создавая его в «новом» хранилище, а при этом также меняет свой идентификатор группы.

Пользователь также сможет создавать новые группы, которые генерируют пустые хранилища и сопутствующие сетки.

После внесения изменений «главное хранилище» очищается от данных, и каждый магазин затем агрегируется обратно в «главное хранилище», а затем выполняет синхронизацию как обычно.

Я уверен, что при создании хранилища и сетки я могу как часть функции присваивать идентификаторы, которые связывают их вместе и дифференцируют их от других магазинов/сетей, но я не знаю, как получить уникальный данные из «главного хранилища» в каждый дочерний магазин.

Это правильный способ посмотреть на это? Цель состоит в том, чтобы избежать множественных экземпляров одного и того же хранилища и применения фильтров, поскольку это не обязательно будет вносить какие-либо изменения в идентификатор группы и избегать использования нескольких магазинов, чтобы сохранить накладные расходы на запрос сервера на отдельные запросы.

Если это (по крайней мере, «a», если не обязательно «правильный») способ сделать это, как мне установить данные в новых магазинах из «главного хранилища»? Я предполагаю, что могу просто перебирать записи в «master store», присваивать массив и применять массив как источник данных каким-то образом, но, как уже было сказано, я не знаю, как это сделать.

Пример модели и хранить код:

Ext.define('ConfirmationModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     'GroupName', 
     'ItemType', 
     'ItemTypeId', 
     'JobNo', 
     'ItemNo', 
     'Thickness', 
     'Cutter', 
     'CutterId', 
     'Source', 
     'Qty', 
     'Material', 
     'MaterialId', 
     'Type', 
     'TypeId', 
     'Work', 
     'WorkId', 
     'InternalFinish', 
     'ExternalFinish', 
     'Notes', 
     'Documented?', 
     'ImportDate', 
     'ImportCheck' 
    ] 
}); 

confirmationStore = Ext.create('Ext.data.Store',{ 
    id: 'confirmationStore', 
    model: 'ConfirmationModel', 
    autoLoad: true, 
    proxy: { 
     // load using HTTP 
     type: 'ajax', 
     url: '<?= $site_url ?>Production/ConfirmationJSON/<?php echo $job_no ?>', 
     pageParam: false, //to remove param "page" 
     startParam: false, //to remove param "start" 
     limitParam: false, //to remove param "limit" 
     noCache: false, //to remove param "_dc" 
     reader: { 
      type: 'json', 
      model: 'ConfirmationModel' 
     } 
    }, 
    groupField: 'GroupName' 
}); 

РЕДАКТИРОВАТЬ:

У меня есть один «мастер-магазин», и в нем, каждая строка будет иметь GroupName, такие как (для краткости) «группы 1' , „группе 2“ и т.д. Мне нужно производить, из „главного магазина“, далее магазинов, каждый ищет что-то вроде:

group1Store = Ext.create('Ext.data.Store',{ 
    id: 'Group 1', 
    model: 'ConfirmationModel', 
    autoLoad: false, 
    proxy: { 
     // load using HTTP 
     type: 'memory', 
     reader: { 
      type: 'json' 
     } 
    } 
}); 

group2Store = Ext.create('Ext.data.Store',{ 
    id: 'Group 2', 
    model: 'ConfirmationModel', 
    autoLoad: false, 
    proxy: { 
     // load using HTTP 
     type: 'memory', 
     reader: { 
      type: 'json' 
     } 
    } 
}); 
... 
group#Store = Ext.create('Ext.data.Store',{ 
    id: 'Group #', 
    model: 'ConfirmationModel', 
    autoLoad: false, 
    proxy: { 
     // load using HTTP 
     type: 'memory', 
     reader: { 
      type: 'json' 
     } 
    } 
}); 

этих магазинов будут содержать только запись, относящуюся к этой группе. Мои мысли состоят в том, чтобы сначала перебрать «главный магазин» и получить все уникальные имена групп в массив, затем создать массив для каждого имени группы и нажать из «главного хранилища» только те записи, где совпадает их имя группы.

Оттуда создайте многомерный массив, чтобы сначала сохранить имя группы, затем массив записей для этого имени группы, затем сгенерировать хранилище и установить имя/id/storeId = group [0] и data = group [ 1]. Возможно, это длинный ветер, но он должен генерировать все необходимые магазины независимо от количества групп.

ответ

0

Поскольку основная цель этого вопроса была группировка информации для вставки в БД SQL, я с изложением, как я работал вокруг группирования выпуска:

Во-первых, я забрал последний идентификатор группы из БД в рамках получения исходной информации для элементов, подлежащих подтверждению.

В качестве части выполнения группировки я добавил дополнительный столбец для идентификатора группировки; это последовательно увеличивало идентификатор группы и применяло ее к каждому элементу, делая каждый элемент «группой одного». Когда я выполнил операцию группировки, я просто увеличил идентификатор группировки и применил его ко всем идентификаторам группируемых элементов.

Я думаю, что метод, о котором я думал в вопросе, значительно затруднен по сравнению с простым увеличением идентификатора группировки. Идея может быть уточнена для повторения каждого элемента при передаче информации на сервер и обеспечения отсутствия пробелов между идентификаторами группировки, но для моих целей просто увеличение значения работает.

1
createStoreClone: function(sourceStore){ 
     var targetStore = Ext.create('Ext.data.Store', { 
      model: sourceStore.model 
     }); 
     var records = []; 
     Ext.each(sourceStore.getRange(), function(record){ 
      if(your_condition){//push record to array when condition is true 
       records.push(record.copy()); 
     }); 
     targetStore.add(records); 
     return targetStore; 
    } 

Используйте эту функцию при событии загрузки вашего основного магазина. Надеюсь, это имеет смысл!

+0

Это, как представляется, не создает несколько магазинов из одного магазина; похоже, это просто. Я обновлю свой вопрос, чтобы попытаться лучше представить свои требования. –

+0

Вы должны вызывать эти функции несколько раз [количество дочерних магазинов, которые вы хотите создать]. Но вам может потребоваться изменить условие if в соответствии с вашим требованием (оно может быть передано в качестве другого параметра для этой функции). Надеюсь, он решает вашу проблему. – Rajinder

Смежные вопросы