加载导航的方案跳过不说,直接进入正题:如何在one site one page的项目中布局。

很多情况下我们可能会选择一个非常经典的布局,就是左边放导航树,右边放显示页面。当然航导树是不动的,而动态改变的只有右边的显示页面。

页面head部分 导航tree(不可动) 用示显示的TabPanel(内容不固定) 实现方案:

  点击导航树时,调用tabelPanel的add方法增加一个panel。而后在该panel中使用border布局。

   

   Ext.Ajax.request({

  url:"../../MenuList!getMenuSub.action",

   params:{id:tp.id},

  method:'POST', 

  success:function(r){ 

    var f = new Ext.util.JSON.decode(r.responseText) 

 

    for(var i=0;o=f.btn[i];i++){ 

       tp.root.appendChild(new Ext.tree.TreeNode( { 

          text : o.title, 

          id:o.pageid , 

           listeners : {

            'click' : function(n) { 

              if(!Ext.getCmp(n.id)){ 

                Ext.getCmp(_tmpid).add({ 

               id:n.id, 

               title:n.text, 

               layout:'fit', 

               frame:true, 

               closable:true, 

               autoLoad:{ 

                url:"functions/" + n.id + ".info",

//functions目录下存放页面功能JS文件。文件命名是:功能模块ID.info 

                  scripts: true, 

                  scope: this, 

                  nocache: true } 

                  }); 

                  } 

                Ext.getCmp(_tmpid).setActiveTab(Ext.getCmp(n.id)); 

               

             

            })); 

       } 

     } });

  

  tabpanel使用autoLoad时,要注意的是autoLoad进来的东西一定要放在一个父容器或render到一个DIV中去。否则将无法显示。当然如果你用window弹出也是可以的。最初的方法当然是第一种。这里我们采用另一种方案,就是将autoLoad进来的组件放到panel中去。实际上在tabpanel中每一个选项卡对应是一个panel,我们可对将组件放到这个panel里面。这里,我扩展了一个类出来: Tp.Panel 类 主要适用于需要放在其容器内部。配合autoLoad方式加载的JS文件。

    

   /* 用法 :

   * new Tp.Panel({ * tabId:'tabid', //指定父容器ID

  * items:items //指定该容器存放的子组件

  * })

   * 注意:此组件不需要使用单独 的renderTo或render()去渲染

   */

    Tp.Panel=Ext.extend(Ext.Panel,{ 

     collapsible:false, 

     hideBoders:false, 

     border:true, 

     tabId:null, 

     autoScroll:true, 

     initComponent:function(){ 

      Ext.getCmp(this.tabId).add(this); 

      //将panel增加到tabpenel中,这里不指定布局。因为子无素不确定 

      Tp.Panel.superclass.initComponent.call(this) 

      Ext.getCmp(this.tabId).doLayout(); 

      } 

     })

    

 

   如此一来我们只需要在功能文件中加入如是代码: (上面已经写出了你自己找下哦) 如果说我们要显示的是一个表单,那么直接在panel里面加上formpanel就可以了。但如此一来会显的非常难看。因为formpanel的父类是panel所以我们考虑直接用一个formpanel代替用于显示组件的panel。看下面方案:  

   

  /* 

  * Tp.FromPanel 类 主要适用于需要放在其容器内部的表单。配合autoLoad方式加载的JS文件。 

  * max为真时最大化显示,否示采用默认布局 

  * 用法: 

  * new Tp.FromPanel({ 

  * Max:true, 

  * tabId:'fun1', 

  * formid:'base', 

  //这里的formid是用于提交 

  * items:[{

    xtype:'textfield',

    fieldLabel:'dddd'

    }] 

  * }) 

  * 注意:此组件不需要使用单独 的renderTo或render()去渲染 

  */ 

  Tp.FormPanel=Ext.extend(Tp.Panel,{ 

     Max:false, 

    /* 

    * Max默认为false 不最大化显示 

    */ 

     isValid:function(){ 

       return this.form.isValid() 

       }, 

    initComponent:function(){ 

     var p ={border:false, 

     // region: , 

     frame:false, 

     autoScroll:false }; 

     Ext.applyIf(p,this);

     this.buttons=null;

     p= new Ext.form.FormPanel(p);

     if(this.Max){ 

     p.region = 'center';

     this.layout='border' 

    

    this.items = p;

    this.form= p.getForm();

    this.getForm=function(){ return p.form } 

    Tp.FormPanel.superclass.initComponent.call(this) 

     } 

  })

 


这里我把当初为了学习Ext而编写的代码给当大看看,代码中可能存在一起不是很合理的地方。猛点这里

 

  如果有什么疑问欢迎到JavaScript程序园 论坛里一起交流