ExtJs非Iframe架構載入頁面實現

來源:互聯網
上載者:User
在用Ext開發App應用時,一般的架構都是左邊為功能表列,中間為tab頁方式的顯示地區。而tab頁面大多採用的嵌入一個iframe來顯示內容。但是採用iframe方式有一個很大的弊端就是每次在載入一個新的iframe時都要將Ext的核心js,css檔案重新載入。由於Ext是一個龐大的類庫,這些檔案的體積都很龐大,僅僅是ext-all.js就有400多k,所以用iframe方式載入就大大降低了效率。為了能解決這個問題,我推薦使用Ext.Panel的autoload模式進行載入頁面。用這種模式載入就可以避免Ext核心檔案重新載入的問題。可以很好的提高程式的運行效率。以下我簡單介紹一下實現的過程和原理,以及我在開發是遇到的問題和如何解決這些問題。

  這種模式的幾個技術點在於

  1.菜單的點擊事件實現?
  2.將要載入的頁面該如何編寫?
  3.如何讓載入頁面的控制項的高度和寬度自適應,比如Panel,grid?   
   

  菜單事件的實現
  這個函數需要三個參數,
  a.模組編號,這個編號是自訂的,別且一定要唯一。在菜單點擊事件中要把這個編號傳過來,作為tab子頁的id
  b.模組的url,tab子頁autoload的url
  c.模組的名稱,tab子頁的title
  代碼如下:
  
   function addtab(id,link,name){
      var tabId = "tab-"+id; //為id稍作修改。
      var tabTitle = name;
      var tabLink = link;
   
      var centerpanel = Ext.getCmp('displayCenterPanel');
      var tab = centerpanel.getComponent(tabId);//得到tab組建
   
      var subMainId = 'tab-' + id + '-main';
   
      if(!tab){
   
        tab = centerpanel.add(
            new Ext.Panel({
                id:tabId,
                title:tabTitle,
                    //autoLoad:{url:tablink, scripts:true,nocache:true},
                autoScroll:true,
                iconCls:'tabIconCss',
                layout: 'fit',
                border:false,
                closable:true
            })
        );
        
        centerpanel.setActiveTab(tab);
   //載入頁面的方法
        tab.load({
            url: tabLink,   //URL地址
            method:'post',  //post or get
            params: {subMainId: subMainId},   //傳值
            scope: this, // optional scope for the callback
            discardUrl: true,
            nocache: true,
            text: "頁面載入中,請稍候……",  //頁面載入前的提示資訊
            timeout: 9000,   //頁面載入逾時設定
            scripts: true  //支援頁面所有的dom元素
        });
            
    }else{
        centerpanel.setActiveTab(tab);
    }   
}

   將要載入的頁面該如何編寫
   <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
   <%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld"%>
   <%
        String mainName = (String)request.getParameter("subWcid");
    %>
<script>
        /*
                用到的js檔案
                1、../js/appjs/frontMg/exposure/exposure.grid.js
                2、../js/appjs/frontMg/exposure/exposure.search.js
                3、../js/appjs/frontMg/exposure/exposure.view.js
                4、../js/appjs/frontMg/exposure/exposure.win.js
                5、../js/appjs/frontMg/exposure/exposure.js
        */
        var mainName = "<%=mainName%>";
        var Front_exposure_ButtonIds = '<s:property value="funccode"/>';
</script>

<div id="<%=mainName%>-p" style="height:100%"></div>

<script language="javascript" type="text/javascript" src="../js/appjs/frontMg/exposure/exposure2.js"></script>
   

    載入頁面的控制項的高度和寬度自適應
   由於這種使用autoload模式載入進來的頁面是不能隨著瀏覽器的大小變化而變化的。所以我們要實現瀏覽器的大小變化函數,即window.onresize事件。
   但是在實現這個事件的時候,一定要加上setTimeout來控制它,讓其延遲一會兒執行,否則是不能達到我們的效果。
  //控制tab頁面容器大小的函數
  function allComResize(){

        var modelidarr = modelids.split(",");
    var len = modelidarr.length;

    if(len==0){
        return false;
    }
   
    var w = Ext.getCmp('displayCenterPanel').getActiveTab().getInnerWidth();  
    var h = Ext.getCmp('displayCenterPanel').getActiveTab().getInnerHeight();
      
    for(var i=0; i<len;i++){
        var tmpmodelid = modelidarr;

        var subPage = Ext.getCmp("tab-"+tmpmodelid+"-main");

        if(subPage){

                subPage.setWidth(w);
                subPage.setHeight(h);
        }
        
    }
   

}
  //通過window.onresize事件來執行allComResize函數控制tab容器的大小
   var oTime;
window.onresize = function()
{
    if (oTime)
    {
        clearTimeout(oTime);
    }
    oTime = setTimeout("allComResize()", 100); //延遲100毫秒執行
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.