在ExtJS 4中提交表单+网格

时间:2011-09-14 15:55:07

标签: javascript web-applications extjs extjs4

我有一个包含网格和一些文本字段的Ext.form.Panel,用于编辑网格中的每一行。它非常类似于:http://dev.sencha.com/deploy/ext-4.0.2a/examples/writer/writer.html,只是没有涉及AJAX;我的数据存储是本地的。

如何通过标准POST提交网格行?

如果我只是执行myForm.submit(),则有两个问题:

  1. 正在验证用于编辑网格行的字段。提交表格时应忽略它们。

  2. 未提交网格中的数据。

  3. 我看到的唯一解决方案是以某种方式阻止对字段进行验证,并创建一些包含每行数据的隐藏字段。还有更好的选择吗?

    提前谢谢!

2 个答案:

答案 0 :(得分:8)

以下是我使用的解决方案:

  1. 为了在提交时忽略表单中的某些字段,我已经覆盖了表单的getFields()方法。讨厌,我知道。在下面的代码中,将忽略具有“ignoreInMainForm”属性的字段。

    Ext.getCmp('myForm').getForm().getFields = function() {
        var fields = this._fields;
        if (!fields) {
            var s = [],
            t = this.owner.query('[isFormField]');
            for (var i in t) {
                if (t[i]['ignoreInMainForm'] !== true) {
                    s.push(t[i]);
                }
            }
            fields = this._fields = Ext.create('Ext.util.MixedCollection');
            fields.addAll(s);
        }
        return fields;
    }
    
  2. 为了提交网格数据,我在单个JSON对象中对所有行进行编码,我在表单的baseParams中添加。

    var myItems = myStore.getRange();
    var myJson = [];
    for (var i in myItems) {
        myJson.push({
            'a': myItems[i].get('a'),
            'b': myItems[i].get('b'),
            ...
        });
    }
    Ext.getCmp('formHiddenId').setValue(Ext.encode(myJson ));
    

答案 1 :(得分:1)

这部分对我有用 - 在ExtJS 4.0.2a中,我无法添加到baseParams,所以相反我触发了发送处理程序来代替:

function prepareToSendForm(a, b) {
var myItems = Ext.getCmp('grid-links').store.getRange();
var myJson = [];
for (var i in myItems) {
    myJson.push({
        'title': myItems[i].get('title'),
        'url': myItems[i].get('url'),
        'refreshes': myItems[i].get('refreshes')
    });
}

//Update the hidden field to be the JSON of the Grid
for (var i=0, len=Ext.getCmp('roomCreateForm').getForm()._fields.items.length; i<len; i++) {
    var item = Ext.getCmp('roomCreateForm').getForm()._fields.items[i];
    if (item.name=='roomLinks') {
        Ext.getCmp('roomCreateForm').getForm()._fields.items[i].inputEl.dom.value=Ext.encode(myJson);
        break;
    }
}

Ext.getCmp('roomCreateForm').submit();
}

哪个有用呢(但不是非常即插即用)。我不得不在表单中创建一个隐藏字段(上面名为roomLinks),上面的第二个for循环找到它并用JSONed结果替换该值。