TabPabel基礎

摘要鏈接:http://www.cn-java.com/www1/?uid-551263-action-viewspace-itemid-4286

這份教程目的在於對TabPanel類進行一次快速介紹。所提及的知識都是來自我對TabPanel範例、Ext源碼和API文檔的學習。到本文最後,你應該完成好一個Tab Panel,這個TabPanel能夠:

  • 創建新tab,其內容來自一個URL。
  • 判斷某個tab是否存在,有的話加載新內容。

 Step 1: 創建 HTML 骨架

我們將會用下列HTML,和Ext一齊構建一個基本的結構。複製這些內容到一個叫tptut.heml的文件,並要求是運行在服務端的,當然 也要保證ext-all.cssext-base.js, 和 ext-all.js這些Ext安裝路徑的正確。然後按照以下步驟創建tab_actions.js:

<html>
<head>
<title>TabPanel教程</title>
<!-- Ext CSS and Libs -->
<link rel="stylesheet" type="text/css"	href="../include/ext2/resources/css/ext-all.css" />
<script type="text/javascript"	src="../include/ext2/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../include/ext2/ext-all.js"></script>
 
<!-- Custom CSS and Libs -->
<script type="text/javascript" src="./tab_actions.js"></script>
<style>
#actions li {
	margin:.3em;
}
#actions li a {
	color:#666688;
	text-decoration:none;
}
</style>
</head>
<body>
 
 
<ul id="actions" class="x-hidden">
	<li>
		<a id="use" href="#">Use Existing Tab</a>
	</li>
	<li>
		<a id="create" href="#">Create New Tab</a>
	</li>
</ul>
 
<div id="tabs"></div>
</body>
</html>

以上代碼有兩個地方的元素需要注意。我們將使用"actions"(動作列表)這種簡易的實現來執行tab的創建。"tabs"的那個div將用於Tab面板中第一個默認tab的容器。

 Step 2: Ext結構的構建

在剛纔那個目錄中創建一個文文件。就叫做作tab_actions.js,加入下面JavaScript.


Ext.onReady(function(){
   // 包含actions的菜單
    var tabActions = new Ext.Panel({
    	frame.:true,
    	title: 'Actions',
    	collapsible:true,
    	contentEl:'actions',
    	titleCollapse: true
    });
 
    // 保持actions菜單的父面板
    var actionPanel = new Ext.Panel({
    	id:'action-panel',
    	region:'west',
    	split:true,
    	collapsible: true,
    	collapseMode: 'mini',
    	width:200,
    	minWidth: 150,
    	border: false,
    	baseCls:'x-plain',
    	items: [tabActions]
    });
 
    // 主面板(已有tab)
    var tabPanel = new Ext.TabPanel({
		region:'center',
		deferredRender:false,
		autoScroll: true, 
		margins:'0 4 4 0',
		activeTab:0,
		items:[{
			id:'tab1',
			contentEl:'tabs',
    		title: 'Main',
    		closable:false,
    		autoScroll:true
		}]
    });
 
    //  配置視圖viewport
    viewport = new Ext.Viewport({
           layout:'border',
           items:[actionPanel,tabPanel]});
});

上面的代碼被套上一個Ext.onReady的函數,以防止頁面元素未全部加載就執行代碼了。接着要做的事情是將我們的動作列表(Action list)轉換到名字爲tabActions的那個面板,該命名是由contentEl (content element)(內容元素)這個配置項參數所指定的。

接着,創建一個父面板actionPanel來保持菜單面板。我們已tabActions 作爲一個item項的參數。由於actionPanel會由視圖Viewport的LayoutManager來頁面定位,所以我們須在配置項對象中指定一個區域。

第三個步驟是創建TabPanel(Tab面板)本身。我們想在頁面居中,即是對應於視圖的中部。還要將一系列的tab配置項對象參數傳入到面板中。在這裏例子中,參與內置渲染的只有一個tab,但是多個也是可以的。如能確定每個面板在頁面上能夠被當作容器使用,便可以成爲該數組的元素。像當前的情況,我們是把tabs作爲第一個面板的內容元素。 要注意,我們這指出了tab的Id。這就是我們稍後獲取的tab的依據。

最後,我們設置視圖, 用於瀏覽器可視區域的控制。 所需要做的就是指定一個佈局(layout)和什麼要顯示的組件。組件已經由視圖的LayoutMangager(視圖管理器)配置好適合放置的區域。

這時,你應該在瀏覽器觀察到,包含Acitons菜單的兩個格式化列在左邊,tab面板佔據了屏幕的其餘位置。

 Step 3: 創建Tab控制邏輯

現在我們所需的元素已經創建好了, 可以增加Tab面板的創建(creating)和更新(updating)方法。 在當前目錄中新建三個頁面以便我們的測試:

  • loripsum.html
  • sample0.html
  • sample1.html

這三分文件的實際內容無關緊要, 但最好是每份的內容應該有所不同,好讓tab加載內容後區別開來。

打開tab_actions.js,在viewport創建的位置插入下列代碼:

// 在中間的面板加入tab
    function addTab(tabTitle, targetUrl){
        tabPanel.add({
	    title: tabTitle,
	    iconCls: 'tabs',
	    autoLoad: {url: targetUrl, callback: this.initSearch, scope: this},
	    closable:true
	}).show();
    }
 
    // 更新tab內容,如不存在就新建一個
    function updateTab(tabId,title, url) {
    	var tab = tabPanel.getItem(tabId);
    	if(tab){
    		tab.getUpdater().update(url);
    		tab.setTitle(title);
    	}else{
    		tab = addTab(title,url);
    	}
    	tabPanel.setActiveTab(tab);
    }
 
    // 映射連接的id到函數
    var count = 0;
    var actions = {
    	'create' : function(){
    		addTab("New Tab",'loripsum.html');
    	},
    	'use' : function(){
    		// 演示頁之間的輪換
    		updateTab('tab1','替換' + count + ' 次','sample'+(count%2)+'.html');
    		count++;	    		
    	}
    };
 
    function doAction(e, t){
    	e.stopEvent();
    	actions[t.id]();
    }
 
    // body初始化後,viewport setup過後才能執行下面的代碼
    actionPanel.body.on('mousedown', doAction, null, {delegate:'a'});

函數addTab(...) 需要標題title和URL字符串兩個參數,然後傳遞到tabPanel.add(...)裏的配置項對象。 這會返回創建好的面板對象,上面的代碼立即調用了show()方法顯示內容。

函數updateTab(...) 需要多個tabId的參數,以便能檢測這個tab是否存在。如果是,面板會獲取Updater進行面板內容的更新。若然不是,會調用addTab(...)創建tab。

最後一個步驟, 增加一個actionPanel的監聽器,來響應選區動作之後的事件後,執行相應的函數。先要說明的是,actions是一創建好的對象,對象可被認爲是一種哈希表(HashTable)或是字典(Dictionary),一一映射了動作和方法兩者。注意“鍵key”對應於HTML list項。 由於方法比較簡單,我們就直接這裏寫好了。變量counter用於清晰顯示tab之間的切換,沒有其他特定的功能。


事件處理器(event handler)doAction(...)執行時會有兩個參數傳入:事件對象和目標對象,actions函數查找目標對象的id然後執行相應的方法。 當任意一個actionPanel's的組件被按下,將會觸發mousedown的事件,偵聽器立即通知已登記的事件處理器doAction(...)運行。 被按下的那個組件便是事件對象的目標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章