2016-04-01 6 views
1

Мы имеем следующий магазин в ExtJS 4.2:ExtJS хранить иногда вызывая создать вместо обновления

Ext.define('Example.store.BasketDocuments', { 
    extend: 'Ext.data.Store', 
    model: 'Example.model.Document', 
    autoLoad: true, 
    autoSync: true, 
    sorters: [ 
    { 
     property: 'doc_type', 
     direction: 'ASC' 
    } 
    ], 
    proxy: { 
    type: 'rest', 
    url: baseUrl + 'document_basket', 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json;charset=utf-8' 
    }, 
    reader: { 
     type: 'json', 
     root: 'items' 
    }, 
    writer: { 
     type: 'json' 
    }, 
    actionMethods: {create: "POST", read: "GET", update: "PUT", destroy: "DELETE"} 
    } 
}); 

Он крепится к сетке с перетаскиванием функциональных возможностей.

Когда мы тянем около 10 файлов (9 работает) к сетке, которая будет немедленно обновить магазин, мы получаем ошибку сервера, потому что мы не выполняем функцию POST для URL-адресов, как

/api/document_basket/1964?_dc=1459498608890&{} 

Это только для одной записи.

Для остальных это было бы

/api/document_basket?_dc=1459498608941&{} 

, который работает.

Перетаскивание только одной записи.

Таким образом, ExtJS отправляет запрос POST с идентификатором в URL, который должен быть PUT вместо этого? Почему это?

ответ

0

Я смог исправить это в своем проекте.

Причина в том, что я добавлял элементы в магазин в цикле - поэтому после каждого добавления - скажем, 14 файлов - была выполнена синхронизация.

Я обнаружил, что было 105 запросов, что равно 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14, так что это вызвало состояние гонки.

Решение, чтобы отключить синхронизацию перед циклом:

onBeforeDropItem: function (node, data, overModel, dropPosition, dropHandlers, eOpts) { 
    dropHandlers.cancelDrop(); 

    var store = Ext.getStore('BasketDocuments'); 

    store.suspendAutoSync(); // new 

    if (node.id != 'documenttreepanel-body') { 
     Ext.Array.each(data.records, function (r, index) { 
      r = r.copy(); 
      r.phantom = true; 
      r.data.id = null; 
      r.data.download_size = 1; 
      r.data.download_type = 1; 

      if (r.data.doc_type == 1) { 
       if (r.data.count == 0) { 
        Ext.create('Ext.window.MessageBox').show({ 
         title: Ext.ux.Translate.get('Info'), 
         msg: Ext.ux.Translate.get('Ordner') + '<b>' + r.data.name + '</b>' + Ext.ux.Translate.get(' Is empty and cannot be added ') + '.', 
         buttons: Ext.Msg.OK, 
         modal: true 
        }); 
       } else { 
        store.add(r); 
       } 
      } else { 
       store.add(r); 
      } 
     }); 
    } 

    store.sync(); // new 
    store.resumeAutoSync(); // new 
Смежные вопросы