2011-01-27 15 views
4

私はsetMinValue(...)setMaxValue(...)を使用して、有効な時間要素をユーザーに表示するだけのExtJS TimeFieldを持っています。これはうまく動作しますが、ユーザーがすべての時間要素を再び見ることができるように、minValuemaxValueをリセットするにはどうすればよいですか?Extjs :(TimeField)reset minValueとmaxValue

私はフィールドをクリアしたくありません。ストアのすべての要素を再度表示するだけです。

答えて

5

これを達成するための「きれいな」方法はありませんが、より適切なものが見つかるまでは一時的な回避策があります。

undefinedまたはnullTimeFieldminValuemaxValueを設定してみてください、そして、あなたのTimeFieldにgenerateStore()を呼び出す:

// private 
    generateStore: function(initial){ 
     var min = this.minValue || new Date(this.initDate).clearTime(), 
      max = this.maxValue || new Date(this.initDate).clearTime().add('mi', 
         (24 * 60) - 1), 
      times = []; 

     while(min <= max){ 
      times.push(min.dateFormat(this.format)); 
      min = min.add('mi', this.increment); 
     } 
     this.bindStore(times, initial); 
    }, 

はい、それはので、通常、あなたがそれを使用するべきではありません、プライベートメソッドですが、 minValueまたはmaxValueを単にリセットするだけで、通常はメソッドが呼び出されるため、ステップをスキップしているだけです。両方のプロパティをnullに設定すると、var min, max =の宣言がデフォルトと等しくなります。それはあなたがメソッドに渡す値のうち日付を解析しようとするプライベートメソッドを使用していますので、あなたは(それが解析ヌルで失敗します)setMinValue()またはsetMaxValue()を呼び出すことにより、これについて行くことができない。

// private 
    setLimit: function(value, isMin, initial){ 
     var d; 
     // will fail here 
     if(Ext.isString(value)){ 
      d = this.parseDate(value); 
     // will fail as well 
     }else if(Ext.isDate(value)){ 
      d = value; 
     } 
     // will never make it here, because 'd' wasn't set above 
     if(d){ 
      var val = new Date(this.initDate).clearTime(); 
      val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(), 
         d.getMilliseconds()); 
      this[isMin ? 'minValue' : 'maxValue'] = val; 
      if(!initial){ 
       this.generateStore(); 
      } 
     } 
    } 

更新:

クリーナーアプローチはTimeFieldを拡張し、上記を達成resetMinAndMaxメソッドを追加(ストアを生成するために呼び出す、ヌルへのminValue/maxValueの設定)、またはオーバーライドでメソッドを追加することであろう。そうすれば、どこでも「私的な」generateStore()への呼び出しを避けることができます。

+0

単に

this.setMinValue(false); 

を使用することができます** @ McStretch:**あなたの提案は間違いなく2つの良いアプローチでしょうが、彼らは両方の着信パラメータをチェックしていなかった私はなぜだろう'setMinValue'と' setMaxValue'を使って 'null'か' undefined'かそれに類するものがあるかどうかを確認し、それに応じて動作します。しかし、あなたの精巧な答えに感謝します! – Chau

+0

@チャウ:そうですね、それはちょうど彼らの見落としであったと思います。開発者は、コンポーネントの作成後に最小/最大をリセットするのが奇妙なユースケースであると思ったのかもしれません。 – McStretch

+0

** @McStretch **: 'TimeField'を*拡張する代わりに' resetMinValue'と 'resetMaxValue'を' TimeField'のプロトタイプに追加する*と同様の、もっと良い方法がありますか?私の推論は、リセット方法が便利ではなく、少なくとも無関係ではないケースを見ることができないということです。 – Chau

0

ページの読み込み時の初期値の後にはありますか?その場合、FIELDクラスのreset()メソッドを使用できるはずです。 timefieldコンポーネントはFIELDから拡張されているので、これにアクセスする必要があります。

1

extjsはコンポーネントから値をリセットするだけです(私が間違っていない場合)。私のコードがより良い方法であるかどうかわかりませんが、上記の答えと同じです。 Fieldクラスのコードを使用してDateFieldクラスのresetメソッドを呼び出し、元の値(originalMinValueおよびoriginalMaxValue)を保持する2つのプロパティを追加します。

originalMinValueとoriginalMaxValueは、my Dateフィールドのrenderイベントで開始されます。

this.setValue = this.setValue.createSequence(this.updateHidden); 
this.originalMinValue = this.minValue; 
this.originalMaxValue = this.maxValue; 
// this is part of me onRender event code 

、それはこのようオーバーライド

Ext.override(Ext.form.DateField,{ 
originalMinValue : null, 
originalMaxValue : null, 
reset : function() {     
    this.setValue(this.originalValue);  
    this.setMinValue(this.originalMinValue); 
    this.setMaxValue(this.originalMaxValue); 
    this.clearInvalid();   
} 

})

だ、我々は値のminValue、およびMaxValueをバックoriginalValueに行く、その後、コンポーネントのリセット方法Eを使用することができます。

私の悪い英語のために申し訳ありません。

3

あなたは幸運

+0

が私のために働いた。ありがとうございました – Raghavendra

関連する問題