2010-12-07 12 views
4

私はExtJsでこのフォームを持っています。 field1が空でない場合、field2は空であってはなりません。しかし、リスナーが発砲しても動作しません。ExtJsフォーム検証の質問

{ 
xtype : 'panel', 
title : 'title 1', 
items : [{ 
    xtype : 'fieldset', 
    title : 'field A', 
    items : [{ 
     xtype : 'textfield', 
     fieldLabel : 'Line 1', 
     id : 'field1', 
     listeners: { 
      change: function(f, new_val) { 
      if (new_val) { 
       //alert("change" + new_val); 
       f.field2.allowBlank = false; 
      } else { 
       f.field1.allowBlank = true; 
      } 
     } 
    }, 
      code for field2 
      ] 
} 

答えて

5

部分的な答え:

allowBlankが設定値があるので、あなたのコードが動作しない理由がある - それは唯一のコンポーネントが作成された時点で効果があります。私はこの間違いをいつも見ています - APIドキュメントをブラウズするとき、これらの設定オプションはすべて、オブジェクト作成時にのみ有効であることを覚えておく必要があります。既存のオブジェクトの動作を変更するために設定できるパブリックプロパティではありません。

つまり、私はAPIにsetAllowBlank()メソッドがないことに驚いています。私はそれを行う方法を見つけることができれば、私は周りを見回し、この答えを修正し続けます。

EDIT:それは、TextFieldのソースコードの私の読書から、仕事をすべきで、あなたの方法を表示されます。だから問題はそれがなぜではないかということです。

EDIT2:おそらくあなたのTextFieldへの参照を取得できません。 f.field1はおそらくあなたが思うものを指さないでしょう。これを解決するには、ref:'field1'をTextField設定に追加します。 FormPanelにはfield1というプロパティがあり、これを参照することができます。

+0

allowBlankは設定値であり、そのまま使用することに同意しますが、それでもプロパティとして使用することはできます。私は以前のプロジェクトでそれをやっていたので、OPが描いている望ましい機能を手に入れることができました。今私はそれをする方法を覚えて家に帰るまで待つ必要があります:P。私を間違えさせてはいけません。コードは間違いなくクルージュでした。 – McStretch

+0

@McStretch - あなたが正しいように見えます。ちょうどそのコードを見て、確かにTextFieldの内部は検証時にthis.allowBlankを検査するだけです。ドキュメントには、単なる設定オプションではなく、パブリックプロパティとしてリストされているはずです。 – timdev

+0

私は開発者が読み込み専用にしていると思っていますが、その場でプロパティを変更すると便利な場合があります。 OP事件のようなものです。だから私は同意する、それはおそらくこの機能を開発する明確な方法がない限り、プロパティである必要があります。 – McStretch

2

markInvalid関数を使用できます。例:

これは正確なコードではありませんが、無効で無効な無効なメッセージをマークする方法から分かります。私はあなたのニーズに完全に合っているかどうかはわかりませんが、独自のバリデーターを作成する機能もあります。