2011-06-27 66 views
1

我在表單中使用一個非常簡單的RadioGroup。我的表單通過form.loadRecord()方法填充記錄,後來根據form.updateRecord()中的值更新記錄。它的工作原理,我可以加載記錄並保存它們,在這一點上沒有問題。ExtJS 4,問題始終是「髒」的radiogroup

當我想檢查窗體的髒狀態,使用其方法isDirty()時,出現問題。它總是'真'。我基本知道爲什麼,那是因爲RadioGroup的原始值總是等於「0」,而不是由loadRecord()設置(它只是將值應用於adhoc radiogroup的子節點)。 。

- > form.getFields()項[10] .originalValue =評分: 「0」

- > form.getFields()項[10] .getValue() =評分:「 3「

我應該補充說其他字段都是髒的(trackResetOnLoad在窗體上設置爲true,允許在載入記錄時重置窗體)。這個問題只發生在radiogroup上。

這裏是我使用的radiogroup的代碼。我試圖爲radiogroup添加「name:'Rating'」,但它崩潰了(顯然它在ExtJS 3.x中工作)。

xtype : 'radiogroup', 
fieldLabel: 'Rating', 
items: [ 
    { 
     boxLabel : 'Zero', 
     name  : 'Rating', 
     inputValue: "0" 
    }, { 
     boxLabel : 'One', 
     name  : 'Rating', 
     inputValue: "1" 
    }, { 
     boxLabel : 'Two', 
     name  : 'Rating', 
     inputValue: "3" 
    } 
] 

感謝您的幫助!

+0

爲什麼你需要知道表單是否爲dirty()或不?我認爲這可以幫助我回答你的問題。 – dmackerman

+0

在**表單數據加載之前它是髒的嗎?我猜不是 – JamesHalsall

+0

dmackerman>我實際上列出了dirtychange事件以啓用/禁用保存按鈕。 – TigrouMeow

回答

1

這只是一般的表單行爲,顯然默認情況下表單沒有字段值,並且當您加載數據時,它明顯會發生更改並使表單變髒。

當我不得不依靠isDirty()方法我手動復位表單字段的值...

Ext.getCmp('fieldId').resetOriginalValue();

雖然這不是一個解決方法,它應該是OK的臨時解決方法。看起來這可能是一個錯誤,可能值得在Sencha論壇上發佈

+0

好主意,所以我現在正在做的是我在每個正在使用的radiogroup上調用resetOriginalValue(),並且一切正常。但是,這仍然是一個解決方法。謝謝 :) – TigrouMeow

1

這仍然是版本4.0.7以上的錯誤。這裏是一個簡短的覆蓋來解決它:

Ext.override(Ext.form.field.Radio, { 
    resetOriginalValue: function() { 
     //Override the original method inherited from Ext.form.field.Field: 
     // this.originalValue = this.getValue(); 
     // this.checkDirty(); 
     this.getManager().getByName(this.name).each(function (item) { 
      item.originalValue = item.getValue(); 
      item.checkDirty(); 
     }); 
    } 
}); 

(你也可以閱讀discusion。我的煎茶論壇主題在這裏原始響應:http://www.sencha.com/forum/showthread.php?182524-RadioField-and-isDirty-problem&p=745308&viewfull=1#post745308

研究/詳細信息:

從Ext.form.Basic的setValues方法開始。裏面的setValues方法將有一個輔助函數SETVAL,看起來像這樣:

​​

你可以看到它調用的setValue在第一場,它由下式給出fieldId(字段名)發現,然後resetOriginalValue。讓我們來看看在的setValue Ext.form.field.Radio:

setValue: function(v) { 
    var me = this, 
     active; 

    if (Ext.isBoolean(v)) { 
     me.callParent(arguments); 
    } else { 
     active = me.getManager().getWithValue(me.name, v).getAt(0); 
     if (active) { 
      active.setValue(true); 
     } 
    } 
    return me; 
} 

這個特殊的setValue方法考慮到有具有相同的名稱多個無線電,以及調用setValue上只有一個他們(第一個通過在基本窗體的setValues中調用findField發現的)。

因此,無線電領域的setValue已經變得「聰明」。現在,無線電領域的resetOriginalValue呢?對於無線領域的一個專門resetOriginalValue從未實現的 - 它只是從Ext.form.field.Field默認的,它看起來像這樣繼承:

resetOriginalValue: function() { 
    this.originalValue = this.getValue(); 
    this.checkDirty(); 
} 

然後解決方法是讓resetOriginalValue的收音機爲「聰明「作爲它們的setValue,即考慮到在無線電組中具有多個具有相同名稱的無線電字段。