ExtJS 4 Изменить сетку магазина на лету - PullRequest
25 голосов
/ 04 мая 2011

Можно ли изменить хранилище сетки в ExtJS 4?

Например, у меня есть две модели:

User = Ext.define('User',{
  extend: 'Ext.data.Model',
  [...],
  hasMany: 'Product'
});

Product = Ext.define('Product',{
  extend: 'Ext.data.Model',
  [...]
});

и две сетки.Первая сетка связана с магазином, который использует User модель и загружает вложенные данные JSON из бэкэнда, например

{
  users: [{
     id: 1,
     products: [
       {id: 1},
       {id: 2}
     ]
  }, {
     id: 2,
     products: [
       {id: 3},
       {id: 4},
       {id: 5}
     ]
  }]
}

Все, что я хочу получить, - это когда вы нажимаете на строку в первой сетке, втораяВ сетке должны отображаться продукты пользователя, без подключения к серверу.Все, что я знаю, это то, что user.products(); возвращает Ext.data.Store объект.Поэтому идея состоит в том, чтобы изменить хранилище второй сетки на user.products();, но такого метода не существует grid.setStore(): -)

Заранее спасибо

Ответы [ 4 ]

36 голосов
/ 15 августа 2011

Я думаю, что лучшим решением было бы:

     grid1.on('itemclick', function(view, record) {
         grid2.reconfigure(record.products());
     );
20 голосов
/ 04 мая 2011

Вы смотрите на магазины неправильно.Магазин привязан к сетке навсегда, следовательно, нет grid.setStore().Вы НЕ меняете хранилище для сетки, вместо этого вы меняете данные в хранилище для этой сетки.

Теперь решение вашей проблемы: Вы правы в части, в которой у вас уже есть экземпляр хранилища с вашими данными.то есть;user.products().Тем не менее, вам придется создать магазин для вашей сетки.В этом магазине не будет никаких данных.Теперь, когда вам нужно отобразить информацию о продуктах, вам нужно загрузить хранилище сетки с данными.Вы можете использовать:

  • load ()
  • loadData ()
  • loadRecord ()

для загрузки данных в ваше хранилище.В вашем случае вы можете сделать следующее:

myStore = user.products();
grid.getStore().loadRecords(myStore.getRange(0,myStore.getCount()),{addRecords: false});
9 голосов
/ 19 июня 2013

Если вы хотите прикрепить магазин к сетке после ее создания, вы можете использовать метод bindStore () .

var store = user.products();
grid.getView().bindStore(store);

В качестве альтернативы вы также можете использовать load(), loadData (), loadRecords () и скопируйте данные в свое хранилище.

3 голосов
/ 08 марта 2012

Ответ Абделя Олакары помог мне, когда мне нужно было обновить данные на том, что не имело reconfigure (пользовательский класс наследовал от Ext.form.FieldSet).

Но вам не нужно указывать addRecords или диапазон для getRange, потому что в этом случае мы применяем все настройки по умолчанию.

Это означает, что вы можете сделать:

myStore = user.products();
grid.getStore().loadRecords(myStore.getRange());
...