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

環境: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))
下次找到更好的辦法再來敘說,也歡迎知道的朋友們在評論中給出答案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章