extjs存储有时会调用create而不是update

时间:2016-04-01 08:44:20

标签: javascript extjs extjs4

我们在ExtJS 4.2中有以下商店:

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功能
/api/document_basket/1964?_dc=1459498608890&{}

这只适用于一个条目。

对于其他人来说,这将是

/api/document_basket?_dc=1459498608941&{}

有效。

仅拖动该单个条目有效。

所以ExtJS正在发送一个带有ID的POST请求,该ID应该是PUT吗?那是为什么?

1 个答案:

答案 0 :(得分: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