ExtJS: удалить сетку из панели вкладок, когда ее базовое хранилище пусто - PullRequest
0 голосов
/ 08 марта 2010

У меня есть TabPanel, которая содержит, помимо прочего, сетку, подключенную к магазину.

Несколько событий могут удалить элементы из хранилища.

Я бы хотел, чтобы сетка была удалена из TabPanel, когда хранилище пусто и, возможно, чтобы в моем коде было одно место для проверки этого события.

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

Любая идея о том, как выполнить такую ​​задачу, не испортив Ext, очень ценится. Спасибо:)

Кстати, это фрагмент кода:

var myStore = new Ext.data.Store({
 reader: new Ext.data.JsonReader({fields: MyRecord}),
 listeners:{
  'clear': function(store, recs) {
   myTabPanel.remove(myGrid);
  },
  'remove': function(store, rec, idx) {
   if (store.getCount() == 0) {
    myTabPanel.remove(myGrid);
   }
  }
 }
});

var myGrid = new Ext.grid.GridPanel({
 id: "myGrid",
 title: "A Grid",
 store: myStore,
 frame:false,
 border:false,
 columns: [
 {
  header: 'Remove',
  align:'center',
  width: 45,
  sortable: false,
  renderer: function(value, metaData, record, rowIndex, colIndex, store) {
   return '<img src="images/remove.png" width="34" height="18"/>';
  }
 },{
  header: 'Some Data',
  dataIndex: 'data',
  sortable: true
 }
 ],
 listeners:{
  'cellclick':function(grid, rowIndex, colIndex, e){
   var rec = myStore.getAt(rowIndex);
   if(colIndex == 0){
    myStore.remove(rec);
   }
  }
 } 
});

var myTabPanel= new Ext.TabPanel({ 
 activeTab: 0,
 items: [ fooPanel, barPanel, myGrid]
});

Ответы [ 2 ]

0 голосов
/ 17 марта 2010

Проблема решена: мне просто пришлось удалить сетку, установив для параметра «autoDestroy» значение «false». Фиксированный код ниже.

var myStore = new Ext.data.Store({
 reader: new Ext.data.JsonReader({fields: MyRecord}),
 listeners:{
  'clear': function(store, recs) {
   myTabPanel.remove(myGrid, false);
  },
  'remove': function(store, rec, idx) {
   if (store.getCount() == 0) {
    myTabPanel.remove(myGrid, false);
   }
  }
 }
});

var myGrid = new Ext.grid.GridPanel({
 id: "myGrid",
 title: "A Grid",
 store: myStore,
 frame:false,
 border:false,
 columns: [
 {
  header: 'Remove',
  align:'center',
  width: 45,
  sortable: false,
  renderer: function(value, metaData, record, rowIndex, colIndex, store) {
   return '<img src="images/remove.png" width="34" height="18"/>';
  }
 },{
  header: 'Some Data',
  dataIndex: 'data',
  sortable: true
 }
 ],
 listeners:{
  'cellclick':function(grid, rowIndex, colIndex, e){
   var rec = myStore.getAt(rowIndex);
   if(colIndex == 0){
    myStore.remove(rec);
   }
  }
 } 
});

var myTabPanel= new Ext.TabPanel({ 
 activeTab: 0,
 items: [ fooPanel, barPanel, myGrid]
});
0 голосов
/ 08 марта 2010

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

В любом случае, я думаю, что ваш подход (использование событий магазина и количество записей, чтобы определить, когда его удалить) в основном нормальный. Возможно, вы захотите выяснить, как решить любые ошибки, которые, по вашим словам, вы получаете. Кем они были?

...