3

ExtJS 4 に複雑なフォームがあり、ユーザーがフォーム フィールドから選択した内容に基づいて、フォームのさまざまな部分が動的に有効または無効になります。フォーム フィールドを無効にするときはいつでも、現在そこにある値もクリアします。

フォームを表すモデル クラスがあります。フォームをロードするには、 を使用しますform.loadRecord(model)。ユーザーがフォームを「送信」したときにモデルを更新するには、 を使用しますmodel.set(form.getValues())

問題は、ext のgetValues()実装が無効になっているフォーム フィールドをスキップすることです。値が変更されたフォームフィールドの一部が無効になっているため、これは私の場合に問題を引き起こします(つまり、無効にしたときに値をクリアしたフォームフィールド)。その結果、 を呼び出しても、これらのフィールドはモデルで更新 (クリア) されませんmodel.set(...)

この問題を回避する最善の方法は何でしょうか? 次のアイデアを検討しましたが、どれもあまり良いとは思えません。もっといいのがあれば、聞きたいです。

  • を呼び出す前に、モデルをクリアします (すべてのフィールドを未定義に設定します) model.setValues()。残念ながら、model.clear()メソッドがないため、これはすぐに見苦しくなります。すべてのフィールドを取得し、それらを反復処理して、それぞれを個別にクリアする必要があります。
  • フォームフィールドを無効にしてクリアすると、モデルフィールドもクリアされます。これは、関心の分離に違反しているように見えます。また、ユーザーがキャンセルしてフォームを送信しないことを選択した場合でも、モデルが変更されることを意味します。
  • ext の実装をオーバーライドform.getValues()して、無効なフィールドをスキップしないようにします。Ext.form.field.Field変更が必要な実際のコードはではなくクラスにあるため、これはさらに厄介ですExt.form.Basic
4

5 に答える 5

2

無効化されたフィールドは一般的に (extjs に限らず) 投稿データから常に除外されます。代わりに、フィールドを読み取り専用に設定します。読み取り専用フィールドと無効フィールドの平均的な違いはそれだけです。

于 2014-10-23T20:07:22.537 に答える
1

これが 3 番目のポイントで公開した解決策です。この動作を変更する必要がある唯一の方法は、このメソッドをオーバーライドすることです。

Ext.override('Ext.form.field.Field', {
    getSubmitData: function() {
        var me = this,
            data = null;
        if (!me.isFileUpload()) {
            data = {};
            data[me.getName()] = '' + me.getValue();
        }
        return data;
    }
});

あなたの最初のポイントについて、.reject(false) は役に立ちませんか?

最新のオプションは、次のように、フォーム内のすべてのフィールドの getSubmitData をオーバーライドできます。

{
   xtype: 'textfield',
   getSubmitData: this.getSubmitDataMyOwnVersion
}
于 2012-11-14T02:32:28.377 に答える
1

Note that Mark Wagoner's answer breaks any advanced components / features of other components since it takes the value directly rather then getting the getSubmitValue(). I had to slightly modify Iontivero's answer as that was not the class I found Extjs calling at least in 4.2.0.

Ext.define('YourAppName.override.Field', {
  override: 'Ext.form.field.Base',

  getSubmitData: function() {
      var me = this,
          data = null,
          val;
      if (me.submitValue && !me.isFileUpload()) {
          val = me.getSubmitValue();
          if (val !== null) {
              data = {};
              data[me.getName()] = val;
          }
      }
      return data;
  }
});

then in Ext.application: requires: ['YourAppName.override.Field'],

于 2014-10-23T18:06:19.803 に答える
0

これまでその問題は発生していませんが、setValue()ではなくupdate()メソッドを使用してモデルを更新しています。多分それは無効にされたフィールドを異なって処理しますか?それとも、私たちは主要なテストを始めたばかりなので、この答えも必要になる道を進んでいますか?--これはForm.updateメソッドの基本的な使用法ですが、フォームがExt.form.Panelであり、this.recordがモデルインスタンスであると仮定しています。

//Save record
form.updateRecord(this.record);
this.record.save();
this.record.commit();

それがうまくいかない場合は、同様の名前のメソッドを記述し、フォームパネルを拡張して、値の配列を取得し、それぞれを調べて、nullでない場合にのみ更新するメソッドを含めることをお勧めします。

于 2012-11-13T17:09:23.380 に答える