Ext.form.BasicForm的getValues()和getFieldValues()辨析

来源:互联网 发布:人工智能 配方 编辑:程序博客网 时间:2024/05/22 00:42

环境:Extjs3.3

getValues————Returns the fields in this form as an object with key/value pairs as they would be submitted using a standard form submit.

getFieldValues————Retrieves the fields in the form as a set of key/value pairs, using the getValue() method.

示例:

   若表单中存在combo表单项,displayField和valueField是不同值。

   用getValues得到的是displayValue

   用getFieldValues得到的是valueField

注意:

1、getFieldValues(true)标示只得到脏数据(变动过的数据)

2、getFieldValues不会得到处于disable状态的表单项值。

若需要disable状态的表单项值可以做如下修改:

Ext.override(

Ext.form.BasicForm,

{

getFieldValues : function(dirtyOnly){

       var o = {},

           n,

           key,

           val;

       this.items.each(function(f) {

           if (dirtyOnly !== true || f.isDirty()) {

               n = f.getName();

               key = o[n];

               val = f.getValue();

               if(Ext.isDefined(key)){

                   if(Ext.isArray(key)){

                       o[n].push(val);

                   }else{

                       o[n] = [key, val];

                   }

               }else{

                   o[n] = val;

               }

           }

       });

       return o;

}

}

)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/horizon_cbl/archive/2011/01/11/6128762.aspx

但是经过测试发现,并非如上文所讲的,

若表单中存在combo表单项,displayField和valueField是不同值。

   用getValues得到的是displayValue

   用getFieldValues得到的是valueField

其实对于combo他们获取到的值都是valueField。主要区别在于getValues可以获取如radio,check这种含有多个name属性值相同的元素,而getFieldValues不可以。所以如果页面还有radio这种组件则getFieldValues是无法获取到name属性,解决radio后台传参问题,可用以下方法:

方式一:直接通过form提交的方式

方式二:通过ajax方式

          方法一,用getValues()获取

          方法二,修改getFieldValues定义。

         Ext.form.BasicForm.prototype.getFieldValues = function(dirtyOnly)
{
    var o = {}, n, key, val;
    this.items.each(function(f)
    {
        if(f.disabled || (dirtyOnly && f.isDirty()))
        {
            return;
        }
        n = f.getName();
        key = o[n];
        val = f.getValue();
        if(Util.isFunction(val.render))
        {
            n = val.getName();
            val = val.getValue();
        }
        if(Ext.isDefined(key))
        {
            if(Ext.isArray(key))
            {
                o[n].push(val);
            }
            else
            {
                o[n] = [key, val];
            }
        }
        else
        {
            o[n] = val;
        }
    });
    return o;
};

上面这段代码是我同事写的,不过在form表单里是tabpanel面板的时候,发现当在含有表单组件的某个面板没打开显示出现之前就提交则其会报val是undefined.

不知tabpanel有没有哪个配置属性是可以解决这个问题的,目前我用的方法是  if(Util.isFunction(val.render))添加一个判断,修改为  if(Ext.isDefined(val) && Util.isFunction(val.render))
下次找到更好的办法再来叙说,也欢迎知道的朋友们在评论中给出答案。

原创粉丝点击