2013-07-20 4 views
1

Я пытаюсь сделать GridPanel с локальными данными http://jsfiddle.net/8um4T/
Эта сетка имеет добавлять и удалять вsortable: true в колонке, я буду удалять запись по идентификатору (но мой путь не в состоянии с большими данными)
Вот мои данныеУдалить строку в Сортируемый: истинно в сетке с локальными данными

var simpleData = []; 
var store = new Ext.data.ArrayStore({ 
    fields: ['id', 'name',], 
    data: simpleData 
}); 
for (i = 0; i < 20; i++) { 
    simpleData.push({id:''+i+'', name: 'name'+i});  
} 
store.loadData(simpleData); 

Мой TBAR с кнопкой добавления

tbar:[ 
    {  
     text:'Add', 
     handler:function(){ 
      simpleData.push({id:'x', name: 'name'}); 
      store.loadData(simpleData); 
     } 
    } 
] 

Моя колонка Действие

{ 
    header: '', 
    xtype: 'actioncolumn' 
    , width: 50 
    , items: [{ // Delete button 
     icon: 'http://whatisextjs.com/BAHO/icons/cancel.png', 
     tooltip: 'Delete' 
     , handler: function(grids, rowIndex, colindex) { 
      var record = grid.getStore().getAt(rowIndex); 

      //Delete item in array 
      // if data is large will don't working 
      Ext.each(simpleData, function (items, idx) {    
       if (items.id == record.data.id) { 
        simpleData.splice(idx, 1); 
       } 
      });  

      //Delete record in store 
      grid.store.removeAt(rowIndex); 
     } 
    }] 
} 

если MYDATA мало, то удалить кнопка будет работать. Мои данные в моем примере 20 записей и что не работают

моя идея удалить запись из store после назначения для simpleData. Но как это сделать или у меня есть еще одна проблема, чтобы исправить мою проблему.

    //grid.store.removeAt(rowIndex); 
        // simpleData = grid.store.data; // my idea is (but how) 

ответ

1

Вам необходимо разбить цикл после сращивания массива, вернув false. Вы забираете один из элементов, но цикл не знает об этом. Таким образом, последний элемент будет неопределенным.

Петля не удастся, потому что последний параметр «items» не является объектом. Таким образом, «элементы» не являются объектом и не имеют идентификатора.

В результате вы удаляете этот объект из массива, но никогда не попадаете в grid.store.removeAt (rowIndex); предложение. Я бы сделал:

Ext.each(simpleData, function (items, idx) {    
    if (items.id == record.data.id) { 
    simpleData.splice(idx, 1); 
    return false; 
    } 
}); 
+0

10 спасибо, но если я хочу удалить несколько строк таким образом, я не могу использовать return, потому что он удаляет только одну запись в simpleData? – freestyle

+0

А как насчет моей идеи? Это возможно :) – freestyle

+1

Ваше право Я бы в этом случае спросить, существует ли параметр items, прежде чем пытаться получить свойство id. Что-то вроде if (items && items.id === record.data.id) ... –

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