ExtJS 4 Показать данные из нескольких магазинов в сетке - PullRequest
7 голосов
/ 09 июня 2011

У меня есть 2 модели - например - Пользователи и заказы

Ext.define('AM.model.User', {
    extend: 'Ext.data.Model',
    fields: ['id', 'username', 'firstName', 'lastName', 'state', 'city'],

    associations: [
    {
            type: 'hasMany', 
            model: 'Order', 
            name: 'orders'
    },],        
});

Ext.define('AM.model.Order', {
    extend: 'Ext.data.Model',
    fields: ['id', 'userId', 'date', 'description', 'value'],    
    belongsTo: 'User',   
});

и их магазины.Я ищу способ отображения данных из обоих магазинов в сетке.(поэтому мои столбцы будут firstName, lastName, orderDate, orderDescription, orderValue ...

Как правильно их отображать?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 24 июня 2011

Вы должны сделать это с помощью кода на стороне сервера и получить все эти данные в одном хранилище.

5 голосов
/ 13 июля 2011

Если вы хотите сделать это с ассоциациями, вам нужно определить рендер для вашего столбца сетки.
Вот так:

{
        text: "orderDescription",
        renderer: function(value,meta,record){//1.
       //var orderStore = record.orderStore;//2a.
       //var orderList = ordersStore.data.items;//2b.
       var orderList = record.orders().data.items; //3.This line is the same as 2 the lines above(2a,2b).
       var order = orderList[0]; //4. TODO..loop through your list. 
       var description = order.data.description; //5. 
       return description ;
 },


Я постараюсь объяснить для тех, кто хочет сделать это таким образом.

  1. Третий параметр - это текущая запись в вашем хранилище 'User', отображаемая для сетки. Первые два просто должны быть там, чтобы получить запись. Оставить их не получится.

  2. 1a / 1b. Я оставил их там, чтобы продемонстрировать, как работает ассоциация. По сути, каждая запись в вашем 'User' Store получает свой собственный 'ordersStore'. Он будет называться 'ordersStore', потому что вы включаете в свою ассоциацию [name: 'orders'].
  3. Метод orders() создается автоматически, опять же на основе имени 'orders'. Это просто возвращает orderStore. Магазин содержит поле data ->, которое содержит поле items. items - фактический список заказов.
  4. Теперь у вас есть доступ к вашему списку заказов. Вы можете зациклить заказы сейчас. Или, если у вас только один заказ, только первый.
  5. Ваш order снова содержит поле data, которое содержит ваши фактические данные.

3 голосов
/ 27 мая 2013

Давайте попробуем с примером ниже -

Шаг 1. Добавление записей из Магазина 2 в Склад 2.

var store2 = new Ext.data.Store({
  ...
});
var store1 = new Ext.data.Store({
  ...
  listeners: {
    load: function(store) {
      store2.addRecords({records: store.getRange()},{add: true});
    }
  }
});

Шаг 2. Использование записей из Магазина 2 с Магазином 1.

Например, первый столбец данных поступает из хранилища 1, а данные из хранилища 2 образуют столбцы 2 и 3. Вы можете использовать средство визуализации, которое находит данные во втором хранилище, если «другие» столбцы являются просто «поисковыми». данные, например:

var store1 = new Ext.data.Store({
    ...,
    fields: ['field1', 'field2']
});

var store2 = new Ext.data.Store({
    ...
    id: 'field2',
    fields: ['field2', 'fieldA', 'fieldB']
});

var renderA = function(value) {
    var rec = store2.getById(value);
    return rec ? rec.get('fieldA') : '';
}
var renderB = function(value) {
    var rec = store2.getById(value);
    return rec ? rec.get('fieldB') : '';
}

var columns = [
    {header: 'Field 1', dataIndex: 'field1'},
    {header: 'Field A', dataIndex: 'field2', renderer: renderA},
    {header: 'Field B', dataIndex: 'field2', renderer: renderB}
];

Удачи.

Ref. с здесь

...