2009年4月17日金曜日

ExtJs-36 dirtyについて

先日のバリデータの応用で
ふぉーむでdirtyかどうかを判断して、閉じるときに
「あ、変更しちゃってるけど、保存して閉じるけどいいの?」
って聞きたい。
ので
Close時に

panel.getForm()で取得して
isDirtyをしよう。

×
うまくいかない。変更しても、変更しなくても引っかかる。。
調査:
一個ずつダンプしみる。
どれもこれも引っかかる。

オリジナルと比較すんだよな。たしか。
ロードしたじょうほうはデフォルトじゃないな。確かに。だからだ。
ってことでExtjsallをのぞくと。。。
ありました。

initValue。
domか、getvalueら持ってきてオリジナルに入れる。
これはフォームではなくフィールドのめそっどなので
ロードごにぶん回して呼んでみる

だめだった。

とこの間はここまでだった。
今日はそのつづきで。

さて、、
うーんとinitvalueがprivateメソッドだってことがわかり(ExtJs3.0でコメントに)、
さてじゃぁどうするかと。
そういえばデフォルトってvalueにいれてて、
afterrender後の
initEventで
getvalueしてoriginalValueに格納されてる。
というかロード後のいべんとでoriginalValueにgetValueの値をセットしてやりゃいいわけだ。
で試してみる。

つーかこれはinitvalueこのじっそうだよな。。。

じつは
この実装は、ロード直後にやってたことに気がつく。
これじゃうまくいくはずがない。
だからAction.loadのSuccess時のCallBackでやりゃいいのかな?

あーうまくいったよー


callback_load_success: function( form, action )
{
form.items.each(function(field){
// ロードした情報をオリジナルとする。
//alert(field.originalValue);
field.originalValue = field.getValue();
//alert(field.originalValue);
});
},

onCloseClick : function()
{
//dirtyな情報をチェックTODO:summaryと冗長性あり。
// alert( this.getForm() );
// if( this.getForm().isDirty() ){
// System.Common.MsgBox.showConfirmYN('保存確認', '情報が変更されています。保存しますか?', this.closeConfirmFunction, this);
// }
////これだとなにが変更されたかわからん
var isDirty = false;
var dirtySummary = ''
this.getForm().items.each(function(field){
// なかで情報取得してチェックしているので
if(field.isDirty()){
//
dirtySummary = dirtySummary + field.name + '
';
isDirty = true;
}
});
if( isDirty )
{
System.Common.MsgBox.showConfirmYN('保存確認', dirtySummary + '情報が変更されています。保存しますか?', this.closeConfirmFunction, this);
}
},

これで、閉じるときに保存確認ができるようになった。

0 件のコメント: