Перемещение строк вверх и вниз в EditorGridPanel


Знает ли кто-нибудь о рабочем примере перемещения строк в EditorGridPanel (или знает, почему он не работает для меня)? Я нашел несколько примеров, и те, которые я нашел, используют этот подход:

// calculate the new index, then remove the record from the store, and re-insert it at the new index
grid.getStore().remove(record);
grid.getStore().insert(index, record);

В моем случае это не удается. Он хорошо смотрится в сетке, но 2 DELETE http-запроса на самом деле отправляются на сервер, а не ставятся. Это становится очевидным, когда я перезагружаю страницу-перемещенная строка фактически была удалена.

Он является основной конфигурацией моего магазина:

var remoteJsonStore = new Ext.data.JsonStore({
            storeId: 'colStore',
            autoDestroy: false,
            autoSave: true,
            proxy: new Ext.data.HttpProxy({url:'/exercises/collect/data_rows'}),
            restful: true,
            format: 'json',
            disableCaching: false,
            autoLoad: true,
            writer: new Ext.data.JsonWriter({
              encode: false
            }),
            root: 'data',
            idProperty: 'data_row_id',
            fields: recordFields,
            baseParams:{section_id:GridUtils.properties[gridId]['section_id']},
            listeners:{
              exception:function(misc){
                 // stuff....
              },
              beforewrite:function(store, action, rs, options, arg){
                this.baseParams["position"]=rs.rowIndex;
              },
              beforesave:function(store, data){
                 // stuff....                }
              }
            }
});
1 2

1 ответ:

У меня была аналогичная проблема при реализации представления переупорядочения DnD. Проблема в том, что хранилище помечает каждую запись remove () d для удаления, даже если вы повторно вставляете ее.

Чтение источника Ext.данные.Метод remove () магазина, я нашел решение:

remove: function(records, /* private */ isMove) {

Видите? Мы можем передать второй логический аргумент, чтобы сообщить магазину, что мы просто перемещаем запись! Но будучи помечены как частные и не документированные, мы должны быть осторожны при обновлении до новой версии фреймворка.

Итак окончательное решение таково:

grid.getStore().remove(record, true); // just moving
grid.getStore().insert(index, record);

версия ExtJS: 4.1