2009-06-29 9 views
4

FormPanelはかなり基本的なフォームを表示していますが、基本的に「名前」フィールド、「説明」フィールド、および複数の「ルール」テキストエリアがあります。私が望むのは、ユーザーが最初のそのようなルールテキストエリアにテキストを入力し、別のルールのために(入力を開始すると)別の空のTextFieldを表示できるようにすることです。ExtJSを使用してユーザー入力のFormPanelにTextAreasを動的に追加

現在、指定された名前(newRulesField関数)で呼び出されたときに新しいTextAreasを生成する関数と、テキスト領域内でKeyPressイベントを処理する関数があります。

私が本質的に探しているのは、フォーム内のTextAreasの数を動的に変更する方法です。

は、ここでのコードですが、場合には役立ちます:

function handleRuleKeypress(a,b) { 
    Ext.Msg.alert('kp'); 
} 

function newRulesField(name) { 
    var rulesField = new Ext.form.TextArea({ 
    fieldLabel:  'Rules', 
    anchor:   '100%', 
    name:   name, 
    allowBlank:  false, 
    grow:   false, 
    enableKeyEvents: true, 
    listeners: { 
     keypress: handleRuleKeypress 
    } 
    }); 
    return rulesField; 
} 

function handleNewRuleSetClick(nodes) { 

    var nameField = new Ext.form.TextField({ 
    fieldLabel: 'Name', 
    name:  'ruleSetName', 
    anchor:  '100%', 
    allowBlank: false, 
    grow:  false 
    }); 

    var descField = new Ext.form.TextField({ 
    fieldLabel: 'Description', 
    name:  'ruleSetDescription', 
    anchor:  '100%', 
    allowBlank: false, 
    grow:  false 
    }); 

    var form = new Ext.FormPanel({ 
    labelWidth: 75, 
    defaultType: 'textfield', 
    bodyStyle: 'padding:30px', 
    id:   'newRuleSetPanel', 
    name:  'newRuleSetPanel', 
    title:  'New Rule Set', 
    buttons: [{ 
     text: 'Save', 
     id:  'saveBtn', 
     hidden: false, 
     handler: function() { 
     form.getForm().submit({ 
      url:  'server/new-rule-set', 
      waitMsg: 'Saving...', 
      success: function(f,a) { 
      Ext.Msg.alert('Success', 'It worked'); 
      }, 
      failure: function(f,a) { 
      Ext.Msg.alert('Warning', 'Error'); 
      } 
     }); 
     } 
    },{ 
     text: 'Cancel', 
     id:  'cancelBtn', 
     hidden: false 
    }] 
    }); 

    form.add(nameField); 
    form.add(descField); 
    form.add(newRulesField('rules1')); 

    this.add(form); 
    this.doLayout(); 
} 

答えて

4

あなたはすでにこれを行うには非常に接近している - ちょうどあなたのhandleRuleKeypress機能からあなたnewRulesField関数を呼び出します。このような何か:

function handleNewRuleSetClick(nodes) { 

    var nameField = new Ext.form.TextField({ 
     fieldLabel: 'Name', 
     name: 'ruleSetName', 
     anchor: '100%', 
     allowBlank: false, 
     grow: false 
    }); 

    var descField = new Ext.form.TextField({ 
     fieldLabel: 'Description', 
     name: 'ruleSetDescription', 
     anchor: '100%', 
     allowBlank: false, 
     grow: false 
    }); 

    var form = new Ext.FormPanel({ 
     labelWidth: 75, 
     defaultType: 'textfield', 
     bodyStyle: 'padding:30px', 
     id: 'newRuleSetPanel', 
     name: 'newRuleSetPanel', 
     title: 'New Rule Set', 
     buttons: [{ 
      text: 'Save', 
      id: 'saveBtn', 
      hidden: false, 
      handler: function() { 
       form.getForm().submit({ 
        url: 'server/new-rule-set', 
        waitMsg: 'Saving...', 
        success: function(f, a) { 
         Ext.Msg.alert('Success', 'It worked'); 
        }, 
        failure: function(f, a) { 
         Ext.Msg.alert('Warning', 'Error'); 
        } 
       }); 
      } 
     }, { 
      text: 'Cancel', 
      id: 'cancelBtn', 
      hidden: false 
}] 
     }); 

     function handleRuleKeypress(a, b) { 
      form.add(newRulesField('rules' + Ext.id())); 
     } 

     function newRulesField(name) { 
      var rulesField = new Ext.form.TextArea({ 
       fieldLabel: 'Rules', 
       anchor: '100%', 
       name: name, 
       allowBlank: false, 
       grow: false, 
       enableKeyEvents: true, 
       listeners: { 
        keypress: handleRuleKeypress 
       } 
      }); 
      return rulesField; 
     } 



     form.add(nameField); 
     form.add(descField); 
     form.add(newRulesField('rules1')); 

     this.add(form); 
     this.doLayout(); 
    } 

すでに最新の場合は、おそらく追加のテキスト領域を削除し、新しいテキスト領域を(またはあなたが各キーを押しために新しいものを取得します)追加した場合は、チェックするために追加のロジックをお勧めしますルールが後で空になり、テキストエリアIDを少しきれいに修正します(これはすべてあなたのhandleRuleKeypress関数です)。

私の一般的な考え方は、FormPanelをプライベート関数メンバの代わりにクラスメンバとして保持することです。これにより、作成後に変更するときはいつでもアクセスすることができます。非常にかわいく読める。

+0

私の内部関数は、データを隠す素晴らしい方法であるため、必要な場所でのみ使用できます。より大きなアプリケーションの場合は、他の場所のvarにアクセスする必要があるかもしれませんが、何度もそうしないと...その変数が他の場所では使用できないことを知るのに役立ちます。 –

+0

私は、 extjsのソース、私はそのコメントをコメント内で非公開としてマークします。順応するだけでなく、もっときれいで読みやすいと思うからです。これにより、クラスの他のいくつかの(public/private)関数で関数を再利用することができます。しかし、ついにそれは味の問題だと思う... – Tewr

関連する問題