0

ExtJs Grid パネルを拡張する次の 2 つのクラスがあります。

  1. ReadonlyDataGrid - 名前が示すように、基本的な編集不可能な ExtJs グリッド
  2. EditableDataGrid - セルと行の編集プラグインを備えた ExtJs グリッド

ここで、開発者がグリッド JSON 構成で設定したプロパティに基づいて、上記の 2 つのクラスのいずれかを拡張する新しいクラスを提供したいと考えています。

例:

ジャワ:

parentObj.put("gridType", "readonly");

JS:

Ext.define('Grid.view.GridFactory', {
extend: 'Grid.view.AbstractGridFactory',
alias: 'widget.gridfactory',
singleton: true,
create : function(model){
    var grid;
    switch(model.input.gridType)
    {
        case 'readonly':
            grid = new Grid class extending the ReadonlyDataGrid class;
            break;
        case 'editable':
            grid = new Grid class extending the EditableDataGrid class;
            break;          
    }

    return grid;
  }
});

現在、これを処理するには、2 つの別個のクラス ファイルを作成する必要があります。

クラス 1:

Ext.define('Grid.view.EditableGrid',{
extend : 'Grid.view.EditableDataGrid',
.... //additional features
});

クラス 2:

Ext.define('Grid.view.ReadonlyGrid',{
extend : 'Grid.view.ReadOnlyDataGrid',
.... //additional features
});
  1. これらの 2 つのクラスを 1 つにマージするにはどうすればよいですか?
  2. 上記のように、ユーザー構成に基づいて拡張プロパティを変更したり、正しいクラスを拡張したりするにはどうすればよいですか?
  3. デザイン的にはどちらが良いですか?クラスが 1 つあり、実行時にスーパークラスを変更するか、2 つのクラスを維持しますが、冗長/同じコードを使用しますか?
4

1 に答える 1

1
  1. ミックスインを使用する。
  2. extend技術的には、実行時にクラスを定義し、適切と思われるプロパティを選択できます。
Ext.define('Grid.view.RuntimeGrid',{
    extend: 'Grid.view.' + (model.input.gridType === 'readonly' ? 'ReadonlyDataGrid' : 'EditableDataGrid'),
    //additional features
});

しかし、それは悪い習慣です。

  1. 実行時にスーパークラスを変更するのはさらに悪いことです。設計上、2 つの一見オプションがあります。

    • 2 つのクラスがありますが、繰り返さないでください: 「冗長/同じ」コードを mixin に入れ、両方のクラスに含めます。また
    • そのように構成されている場合に編集可能なクラスを 1 つだけ用意します。構成オプション say を受け入れ、オプションeditableが の場合にのみ、関連する編集プラグイン/エディターをインスタンス化しますtrue
于 2015-06-23T08:58:34.643 に答える