不要在ExtJS中提交空表单字段

时间:2011-07-27 19:58:04

标签: forms extjs

我有一个带字段的extjs表单。用户不需要在每个字段中输入数据,因此我不想提交没有数据的字段。我希望它只发布实际上有数据的字段。这可能吗?

4 个答案:

答案 0 :(得分:4)

我建议使用表单的beforeaction事件。处理此事件时,您可以检查所有字段。如果所有值都为空,则为return false;。以下示例适用于ExtJS4,必须在ExtJS3中工作:

myform.on('beforeaction', function(form, action) {
    if (action.type == 'submit') {
        var doSubmit = false, vals = form.getValues();
        for (var i in vals)
            if (vals[i] !== '') {
                doSubmit = true;
                break;
            }
        return doSubmit;
    }
});

Actualy,不提交空字段的正确方法是使用action submitEmptyText配置。但它在当前版本(ExtJS4.0.2a)中不起作用。

答案 1 :(得分:3)

另一个选项是覆盖组件的getSubmitValue()方法,如果此字段为空,则返回null,这样它就不会包含在提交字段中。

{
    xtype: 'combo',
    getSubmitValue: function(){
        var value = this.getValue();
        if(Ext.isEmpty(value)) {
            return null;
        }
        return value;
    }
}

答案 2 :(得分:1)

不使用表单的提交,而是使用url,方法类型(GET / POST)和params(以及调用文档中说明的任何其他选项)直接调用Ext.Ajax.request(...)。 要生成参数,请迭代表单字段并在添加到参数之前检查空值。

答案 3 :(得分:1)

此错误也存在于ExtJS 4.0.7中。

As Molecule Man指出:

  

Actualy,不提交空字段的正确方法是使用action的submitEmptyText配置。但它在当前版本(ExtJS4.0.2a)中不起作用。

修复此错误的可能解决方案是通过扩展“Ext.form.Bnel”中的2个函数,“Ext.form.Basic”中的getValues(其中包含错误)和createForm(创建基本表单)通过以下方式:

Ext.define("My.form.Basic", {
    alias: "form.mybasic",
    extend: "Ext.form.Basic",
    getValues: function(asString, dirtyOnly, includeEmptyText, useDataValues) {
        var values = {};

        this.getFields().each(function(field) {
            if (!dirtyOnly || field.isDirty()) {
                var data = field[useDataValues ? "getModelData" : "getSubmitData"](includeEmptyText);
                if (Ext.isObject(data)) {
                    var isArray = Ext.isArray;
                    Ext.iterate(data, function(name, val) {
                        if (includeEmptyText && val === "") {
                            val = field.emptyText || "";
                        }
                        if (includeEmptyText || ((!isArray(val) && val !== "") || (isArray(val) && val.length !== 0))) {
                            if (name in values) {
                                var bucket = values[name];
                                if (!isArray(bucket)) {
                                    bucket = values[name] = [bucket];
                                }
                                if (isArray(val)) {
                                    values[name] = bucket.concat(val);
                                }
                                else {
                                    bucket.push(val);
                                }
                            }
                            else {
                                values[name] = val;
                            }
                        }
                    });
                }
            }
        });

        if (asString) {
            values = Ext.Object.toQueryString(values);
        }
        return values;
    }
});

Ext.define("My.form.Panel", {
    alias: "form.mypanel",
    extend: "Ext.form.Panel",
    createForm: function() {
        return Ext.create("My.form.Basic", this, Ext.applyIf({listeners: {}}, this.initialConfig));
    }
});

代码是从ext源代码复制的。唯一的变化是在每个字段的迭代中:引入了以下包装“if”:

if (includeEmptyText || ((!isArray(val) && val !== "") || (isArray(val) && val.length !== 0)))

我有点晚了,但是比以后更好......