2012-01-24 10 views
0

TextFieldchangeイベントにリスナーを追加しました。ユーザーがテキストフィールドの値を変更すると、リスナーがコントロールを取得します。これは素晴らしい。Ext JSのテキストフィールドのプログラム編集ではなく、ユーザーの編集をリッスンする方法は?

リスナーで古い値を復元したい場合もあります。しかし、リスナーでsetValueメソッドを呼び出すと、changeイベントが再び発生します。イベントの再開なしにプログラムによって古い値を復元する最善の方法は何ですか?

答えて

1

あなたがプログラム的に値を変更することを示すTextFieldにフラグを設定することができます。例:

new Ext.form.TextField({ 
    renderTo: 'container', 
    listeners: { 
     change: function(sender, newValue, oldValue) { 
      if (this.restoringValue) { 
       return; 
      } 
      if (newValue == 'XXX') { 
       this.restoringValue = true; 
       this.setValue(oldValue); 
       delete this.restoringValue; 
      } 
     } 
    }, 
    value: 'XXX' 
}); 

変更リスナーにバッファや遅延がない場合は、動作するはずです。

0

イベントハンドラを編集して、関数のcallerを確認します。それに基づいて、イベントハンドラから脱落します。

参照:How to get the caller event and dom element id

+0

ユーザーがイベントハンドラを変更したためにイベントハンドラが呼び出されるかどうかフィールドを変更したりハンドラ自体がフィールドを変更しているため、「呼び出し側」は同じだと私は信じています。どちらの場合でも、 'caller'は' change'イベントのリスナーを呼び出すExt JS関数です。 – bporter

+1

[OK]をクリックし、 "ignoreEvent"という変数を作成します。 setValueでそれを設定/クリアし、フラグが設定されていればイベントを無視します。 –

+0

最初に 'field.suspendEvents(false);を試しました。 field.setValue(value); field.resumeEvents(); 'しかし、これは私のハンドラーが再呼び出しされるのを妨げていないようです。だから、私はフラグを使用するようにあなたの提案に行った。最初のアプローチがうまくいかなかった理由について、誰かが洞察力を持っているかどうか聞いてみたいと思います。あなたの応答のために多くの感謝、Diodeus。 – bporter

0

checkChangeイベントが検索するフィールドのプロパティであるチェック変更イベントを停止するソリューションが見つかりました。それはsetValueメソッドによって発射されたcheckChange機能は、これは、5.1で、それは以前のバージョンかどうかわからないです

checkChange: function() { 
     var me = this, 
      newVal, oldVal; 

     if (!me.suspendCheckChange) { 
      newVal = me.getValue(); 
      oldVal = me.lastValue; 

      if (!me.isDestroyed && me.didValueChange(newVal, oldVal)) { 
       me.lastValue = newVal; 
       me.fireEvent('change', me, newVal, oldVal); 
       me.onChange(newVal, oldVal); 
      } 
     } 
    }, 

であるためである

field.suspendCheckChange =真

です。..

http://docs.sencha.com/extjs/5.1/5.1.1-apidocs/source/Field.html#Ext-form-field-Field-method-checkChange

関連する問題