私は、任意のフレームワーク (jQueryUI、ExtJS など) から任意の JavaScript コントロールを可能にする単純な JavaScript ベースのプラグイン アーキテクチャを開発しています。プラグインして、任意の Web ページで再利用できます。以下の私のプラグインはたまたま ExtJS 4 を使用しています。
最初のプラグインは、最初のタブで適切にレンダリングされます。ただし、ページが読み込まれたときに 2 番目のタブはまだレンダリングされていないため、2 番目のプラグイン (グリッドでもあります) は最初にドキュメント本文をレンダリングし、次にタブ内で適切にレンダリングします (HTMLElement/div が移動されます)。タブが選択されています。タブ内でレンダリングする前に、プラグインのコンテンツを非表示にしたいと思います。また、[タブが選択されているときに]レンダリングすると、列のサイズを変更しない限り、水平スクロールバーは表示されません。
これを修正する方法はありますか?
アイデア: contentEl 以外のものを使用してください。さまざまな ExtJS 構成オプションを活用します。私のアーキテクチャを変更します。
プラグインコードは次のとおりです。
(function(MyNamespace) {
var gridDataStore = ...
MyNamespace.Plugin.Chart = MyNamespace.Plugin.extend({
return {
initialize: function() {
// ...
},
render: function() {
var stockGrid = Ext.create('Ext.grid.Panel', {
autoRender: true,
autoShow: true,
store: gridDataStore,
header: false,
stateId: 'stateGrid',
columns: [
{text: 'Symbol', width: 75, sortable: true, dataIndex: 'symbol'},
{text: 'Description', width: 200, sortable: true, dataIndex: 'description'},
{text: 'Quantity', width: 75, sortable: true, dataIndex: 'quantity'},
{text: 'Last Price', width: 85, sortable: true, dataIndex: 'last_price'}
],
viewConfig: {
stripeRows: true,
enableTextSelection: true
}
});
return stockGrid.getEl().dom;
}
};
}
})(MyNamespace);
プラグインを使用したコードは次のとおりです。
var chart = new MyNamespace.Plugin.Chart();
var anotherPlugin = new MyNamespace.Plugin.Another();
var stocksWindow = Ext.create('Ext.Window', {
title: 'Stocks',
width: 600,
height: 450,
layout: 'fit',
items: [
Ext.create('Ext.tab.Panel', {
activeTab: 0,
items: [{
title: 'Chart',
autoScroll: true,
contentEl: chartPlugin.render() // RENDER FIRST PLUGIN IN FIRST TAB
},{
title: 'Something Else',
autoScroll: true,
contentEl: anotherPlugin.render() // RENDER SECOND PLUGIN IN SECOND TAB
}]
})
]
});
目に見えないコンテナに追加することはできますが、そうすると汚いと感じます:
var container = document.createElement('div');
document.getElementsByTagName('body')[0].appendChild(container);
container.style.visibility = 'hidden';
var stockGrid = Ext.create('Ext.grid.Panel', {
...
renderTo: container
...
});