は、メソッドが呼び出されExt.grid.Panel
た後に発生する「再構成」イベントを提供します。reconfigure()
ただし、ExtJs の現在の 4.1 リリースでは、RowEditing プラグインはこのイベントにフックしません!
自分たちで重い物を持ち上げる必要があるようです。最終的なコードにたどり着くまでに数時間かかりましたが、最終的な解決策はかなり単純です。
RowEditing プラグインは、RowEditor コンポーネントのインスタンスを作成します (わかりましたか? この 2 つを別々に覚えておいてください。名前は似ていますが、コンポーネントは異なります)。RowEditing プラグインは、行エディタなどを表示するタイミングを知るために必要なイベントにフックするグリッドに結び付けるものです。RowEditor は、グリッドでのインライン編集のために行の上にポップアップするビジュアル コンポーネントです。
最初に、行エディタの再構成を試みましたが、おそらく十数通りの方法がありました。内部メソッド、init メソッド、サイズ変更メソッドなどを呼び出してみました。すると、アーキテクチャの良い点に気付きました。RowEditor インスタンスへの単一の内部参照があり、必要に応じて行エディターと遅延ロードを取得するメソッドがあります。それが鍵でした!
RowEditing プラグインを破棄せずに RowEditor を破棄して (プラグインを動的にロード/アンロードすることはできません)、RowEditor を再作成できます。
もう 1 つ落とし穴があります。Ext グリッドの編集プラグインは、各列にいくつかの拡張メソッドを追加し、各列の正しいエディター タイプを取得/設定するために使用されますgetEditor()
。setEditor()
グリッドを再構成すると、適用された拡張メソッドはすべて「なくなり」ます (これらのメソッドが適用されていない新しい列がいくつかあります)。initFieldAccessors()
そのため、プラグインでメソッドを呼び出して、これらのアクセサー メソッドを再適用する必要もあります。
グリッド パネルの再構成イベントのハンドラーは次のとおりです。
/**
* @event reconfigure
* Fires after a reconfigure.
* @param {Ext.grid.Panel} this
* @param {Ext.data.Store} store The store that was passed to the {@link #method-reconfigure} method
* @param {Object[]} columns The column configs that were passed to the {@link #method-reconfigure} method
*/
onReconfigure: function (grid, store, columnConfigs) {
var columns = grid.headerCt.getGridColumns(),
rowEditingPlugin = grid.getPlugin('rowEditor');
//
// Re-attached the 'getField' and 'setField' extension methods to each column
//
rowEditingPlugin.initFieldAccessors(columns);
//
// Re-create the actual editor (the UI component within the 'RowEditing' plugin itself)
//
// 1. Destroy and make sure we aren't holding a reference to it.
//
Ext.destroy(rowEditingPlugin.editor);
rowEditingPlugin.editor = null;
//
// 2. This method has some lazy load logic built into it and will initialize a new row editor.
//
rowEditingPlugin.getEditor();
}
構成リスナーを使用して、これをグリッド パネルに添付しました。
listeners: {
'reconfigure': Ext.bind(this.onReconfigure, this)
}