我正在开发一个简单的基于 JavaScript 的插件架构,它允许来自任何框架(jQueryUI、ExtJS 等)的任何 JavaScript 控件。插入并在任何网页上重复使用。我下面的插件恰好使用 ExtJS 4。
第一个插件在第一个选项卡中呈现良好。但是,由于页面加载时第二个选项卡尚未呈现,因此第二个插件(也是一个网格)首先呈现到文档正文,然后在选项卡内正确呈现(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
...
});