2013-01-16 11 views
9

フォームの状態dirtyを変更する方法falseExt.Form汚れた状態を設定するには?

setDirty(false)の方法はExt.Form.Panelですか?

UPD:

私のタスクは、フォームの変更がある場合にのみ有効になるためにドッキングさSAVEボタンを有効にするためのFormダーティ状態を追跡することです。

私はdirtychangeイベントを追跡しています:

init: function() { 
    this.control({ 
     'form': { 
      dirtychange: function(form) { 
       alert('change');  
      } 
     } 
    }); 
} 

しかし、私はロードレコードとフォームのレコードがロードされた後に汚れている間、私はchageアラートをgetingてるフォームにloadRecord()方法でレコードをロードしていたときに。

レコードの読み込み直後にdirtyフォームの状態をリセットして、レコードがいっぱいになったフォームにdirtychangeイベントの追跡を開始したいとします。

アイデア?

答えて

14

修正

値が設定されます、元の値を変更可能なプロパティがあります。

trackResetOnLoad:真

は、以下のこのJSFiddle

旧答えが不便に終了される可能性がありますが、私は、私はあなたがすると言っているまず

変わらず、それを聞かせてくださいそのような方法は見つかりません

フォームはそのような状態ではないため、フィールドにはそのような状態があります。フォームが行うことはすべて、各フィールドを反復して、それが汚れていないかどうかを確認することです。いずれかのフィールドが汚れている場合は、最後のチェックからこの値(ダーティマーク)が変更されたかどうかがチェックされ、そうであればdirtychangeイベントが発生します。そして、これが最後のチェックとして保存されます(wasDirty

今、彼らは本当にそれをトリガー原因のは、フィールドを見てみましょう:

フィールドがoriginalValueがある!me.isEqual(me.getValue(), me.originalValue)をチェックすることで汚れている場合、彼らはonChangeonResetをチェックしています値が設定された時刻はinitValueとなりました。

は今Ext.form.BasicgetFields()を使用して、フォームのすべてのフィールドの上にフォームを「セット」はもはや「汚い」

反復するために行うには何今はリセットがする(元の値と現在の値を設定します各フィールドでinitValueを呼び出すことで、この値にリセットされます)。

間違ったコードは、まあ、私は上から

var items = form.getForm().getFields().items, 
     i = 0, 
     len = items.length; 
    for(; i < len; i++) { 
    var c = items[i]; 
    if(c.mixins && c.mixins.field && typeof c.mixins.field['initValue'] == 'function') { 
     c.mixins.field.initValue.apply(c); 
     c.wasDirty = false; 
    } 
} 

に私の最後のコードを修正し、working exampleをフォークしてきました

編集

を削除しました。ボタンは、変更が検出されるまで非アクティブのままになり、変更を削除すると再び非アクティブに設定されます。私はこれがあなたが探しているものだと思います。

+0

'Ext.Form.Field'には' setDirty() 'メソッドもありません。 –

+0

更新された質問を参照 –

+1

@ s.webbandit私の更新された回答を参照 – sra

1

reset()があります。引数なしで使用すると、loadRecord()でロードされたフォームデータが保持されます。

データをロードした後にreset()を呼び出すと、フォームはそれ以上汚れてはなりません。私が思う

myForm.loadRecord(record); 
myForm.reset(); 

dirtychangeイベントは、データをロードすることによって呼び出されますが、reset()後、あなたはisDirty()でフォームを確認することができます。

+1

これは正しくありません。フォームにバインドされたレコードインスタンスは保持されますが、ロードされた値は保持されません。 – sra

+0

'Ext.form.Basic.reset()'のためのExtJSのドキュメントを読んだことがありますか?ユーザーが「閉じる」をクリックしたときにダイアログボックスに変更があったかどうかを確認したいという問題がありました。はいの場合は、保存されていない変更があることをユーザーに警告します。フォームに 'loadRecord()'というデータをロードしています。私は、 'reset()'がデータをロードした後に汚れていない状態を作成することを発見して以来、私は常に自分のフォームを汚していました。 – ChrisLo

+1

あなたはそれを読んだことがありますか?しかし、フォームがレンダリングされ空であることが示された場合、この値は 'originalValue'として保存され、' reset() 'はこの' originalValue'をフィールドに復元するため、レコードがロードされるときに重要です。 boolean argは、trueに設定されている場合、レコード参照を消去します。したがって、フィールドが初期化された後にレコードをロードすると、フィールドが初期化される前にレコードをロードするか、trackResetOnLoadプロパティをtrueに設定しない限り、resetはフィールドからすべての値を消去します(originalValueをオーバーライドします) – sra

1

ここで回避するには、非表示のフィールドを使用し、そのフォームの値を設定してフォームをダーティにします。フォームフィールドを含まないウィジェットでこれを使用します。フォームをdirtyに設定するには、隠しフィールドの値を変更してクリーンに設定し、元の値にリセットします。

関連する問題