我正在开发一个简单的基于 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
  ...
});