1

フォーム内で非常に単純なRadioGroupを使用しています。フォームはform.loadRecord()メソッドを介してレコードで埋められ、後でform.updateRecord()を使用してフォームの値に応じてレコードを更新します。それは動作します、私はレコードをロードしてそれらを保存することができます、この時点で問題ありません。

isDirty()メソッドを使用して、フォームのダーティステータスを確認したいときに問題が発生します。それは常に「真」です。基本的に理由はわかっています。これは、RadioGroupの元の値が常に「0」に等しく、loadRecord()によって設定されないためです(アドホックラジオグループの子に値を適用するだけです)。

-> form.getFields()。items [10] .originalValue = Rating: "0"

-> form.getFields()。items [10] .getValue()=評価: "3"

他のフィールドはどれもダーティではないことを追加する必要があります(trackResetOnLoadがフォームでtrueに設定されているため、レコードがロードされたときにフォームをリセットできます)。この問題は、ラジオグループでのみ発生します。

これが私が使用するラジオグループのコードです。ラジオグループに「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"
    }
]

ご協力いただきありがとうございます!

4

2 に答える 2

1

これは一般的なフォームの動作にすぎません。明らかにデフォルトではフォームにフィールド値がなく、データをロードすると明らかに変化してフォームがダーティになります。

メソッドに依存する必要がある場合isDirty()、フォームフィールドの値を手動でリセットしました...

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

これは修正ではありませんが、一時的な回避策としては問題ないはずです。これはバグのようです。Senchaフォーラムに投稿する価値があるかもしれません

于 2011-06-29T22:22:59.140 に答える
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();
        });
    }
});

(ここのSenchaフォーラムスレッドで議論と私の元の応答を読むこともできます:http ://www.sencha.com/forum/showthread.php?182524-RadioField-and-isDirty-problem&p = 745308&viewfull = 1#post745308 )

調査/詳細:

Ext.form.Basic、setValuesメソッドのソースから始めます。setValuesメソッド内には、次のようなヘルパー関数setValがあります。

function setVal(fieldId, val) {
    var field = me.findField(fieldId);
    if (field) {
        field.setValue(val);
        if (me.trackResetOnLoad) {
            field.resetOriginalValue();
        }
    }
}

指定されたfieldId(フィールド名)によって最初に検出されたフィールドでsetValueを呼び出し、次にresetOriginalValueを呼び出すことがわかります。Ext.form.field.RadioのsetValueを見てみましょう。

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メソッドは、同じ名前の無線が複数あり、そのうちの1つ(基本形式のsetValuesでfindFieldを呼び出して最初に見つかったもの)でsetValueが呼​​び出されることを考慮に入れています。

そのため、無線フィールドのsetValueは「スマート」になりました。では、無線フィールドのresetOriginalValueについてはどうでしょうか。無線フィールド用の特殊なresetOriginalValueは実装されていません。これは、Ext.form.field.Fieldのデフォルトから継承されたもので、次のようになります。

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

修正は、無線のresetOriginalValueをsetValueと同じくらい「スマート」にすることです。つまり、無線グループに同じ名前の複数の無線フィールドがあることを考慮に入れます。

于 2012-03-03T01:53:48.040 に答える