使用单个Ajax请求保存整个EditorGrid

时间:2011-04-30 19:46:14

标签: javascript extjs

我想用一个Ajax请求保存一个ExtJS(3.3.1)编辑器。

我已经基于ArrayStore创建了一个编辑器。

var store = new Ext.data.ArrayStore({
    data: arrayData,
    fields: [ 'id', 'qty', 'idService', 'idSubscription', 
                      'description', 'vat', 'amount' ]
});
    [...]
var grid = {
    xtype: 'editorgrid',
    store: store,
    view: gridView,
    colModel: colModel,
    selModel: selModel,
    stripeRows: true,
    tbar: tbar,
    autoHeight: true,
    width: 872,
    clicksToEdit: 1
};

我使用以下处理程序创建了一个“保存”按钮:

app.inv.saveButtonHandler = function () {
    var myForm = Ext.getCmp("formHeader").getForm();
    if (!myForm.isValid()) {
        Ext.MessageBox.alert('Form Not Submitted', 
                        'Please complete the form and try again.');
        return;
    }
    myForm.el.mask('Please wait', 'x-mask-loading');
    Ext.Ajax.request({
        params: { 
            idCustomer: myForm.findField("idCustomer").getValue(),
            issueDate: myForm.findField("issueDate").getValue(),
            documentType: myForm.findField("documentType").getValue(),
            documentNumber: myForm.findField("documentNumber").getValue()           
        },
        url: 'save-sales-document-action',
        method: 'POST',
        success: function (response, request) {
            myForm.el.unmask();
            Ext.MessageBox.alert('Success', 'Returned: ' + response.responseText);
        },
        failure: function (response, request) {
            myForm.el.unmask();
            Ext.MessageBox.alert('Failed', 'Returned: ' + response.responseText);
        }
    });
};

换句话说,我可以使用简单的值发送表单元素,但我不知道如何发送整个数据网格。我想用一个Ajax请求发送整个数据网格。

我已经在逐个单元格保存方法之前使用过,但在这种情况下,我宁愿一次性保存整个网格。我不需要服务器端部分的帮助,我将用Java完成,仅用于客户端JavaScript。

有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:1)

经过一夜的睡眠,仍然没有答案,我做了进一步的尝试,我可以回答我自己的问题。无论如何我都会打开这个问题,万一有人知道更好的方法。

为了解决我的问题,我将属性“storeId:'gridStore'”添加到ArrayStore,所以我可以稍后使用Ext.StoreMgr.lookup()找到该商店,然后,在节省时间,我继续按以下方式按记录构建数组记录:

var gridData = new Array();
Ext.storeMgr.lookup('gridStore').each(function (record) {
    gridData.push(record.data);
});

关键部分是我没有得到整个记录,只有它的数据字段。

在我有一个包含数据的数组之后,简单的部分是将它添加到Ajax.request的参数中:

params: {
    ...
    gridData: Ext.encode(gridData)
},

这终于奏效了。所有数据都在单个字段中编码。当然在服务器上它必须被解码。