1. 程式人生 > >ExtJS (3.3的使用)

ExtJS (3.3的使用)

專案中使用到 EXT 3.3/3.4 做開發(09年的專案)

 下載 Ext 3.3所需的 資料

目錄

 1  面板的建立

2  viewPort 的建立

3 對話方塊,彈出框

 4 選項板 (tabpanel)

也可以直接把html中的標籤替換成TabPanel

動態tab


 1  面板的建立

  顯示一個panel


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	
	<link type="text/css" rel="stylesheet" href="ext-3.3.0/resources/css/ext-all.css" />
	<script language="javascript" src="ext-3.3.0/adapter/ext/ext-base.js"></script>
	<script language="javascript" src="ext-3.3.0/ext-all.js"></script>
	<script language="javascript" src="ext-3.3.0/src/locale/ext-lang-zh_CN.js"></script>
	</head>
	
<body>
 <script type="text/javascript">
        Ext.onReady(function(){
           new Ext.Panel({
              title: "面板用法",
              width: 300,
              height: 200,
              renderTo: Ext.getBody(),
              html: "<h1>面板主區域</h1>",
              tbar: [{
                 text: "頂部工具欄topToolbar"
              }],
              bbar: [{
                 text: "底部工具欄bottomToolbar"
              }],
              buttons: [{
                 text: "按鈕位於footer"
              }]
           });
        });
        </script>
</body>
</html>	

可以顯示一個簡單的panel

    panel分為5個部分:
         頂部工具欄 (tbar),底部工具欄(bbar),面板頭部(header),面板底部(bottom),面板主區域(body)

 

其中: height / width 定義panel顯示的寬高

title 是panel的標題

html 是panel中顯示的內容

renderTo 確定panel顯示的位置

一般把所有的工具欄和麵板上的按鈕放到一起

 new Ext.Panel({
              title: "面板用法",
              width: 300,
              height: 200,
              renderTo: div2,
              html: "<h1>面板主區域</h1>",
              tbar: [{
                 text: "頂部工具欄"
              },{
                 text: "底部工具欄"
              },{
                 text: "重新整理"
              }
			  ],
              
              buttons: [{
                 text: "按鈕位於footer"
              }]
           });

 

面板Panel主要有下面幾個特點:

1)、面板可以理解成應用程式中的一個介面塊,這個塊可以大,也可以小,這一個塊包含了特定的樣式資訊;

2)、面板Panel繼承自Container類,因此,面板是一個視覺化容器元件;也是其它大多數視覺化控制元件如TabPanel、Window、TreePanel的基類;

3)、面板中即可包括其它元素元件,也可以包含特定html程式碼片段,可以在程式中動態更新面板中的內容;

4)、面板由固定的5個部分組成,除了body部份以外,其它部分都不是必須的。

 

  

如果要在面板中放置Ext元件或控制元件元素,則可以通過面板的items屬性來指定,這個屬性的值可以是一個數組,表示面板中有很多子元素,也可以是一個物件,表示面板中只定義一個子元素。當面板物件建立以後,可以通過面板容器的add、insert來動態往面板中增加子元素,用remove方法來在面板動態刪除子元素。

2  viewPort 的建立


 <script type="text/javascript">
        Ext.onReady(function(){
         
		   
		    new Ext.Viewport({
             
             layout :'fit', 
              items: [{
			  title: "viewPort",
               html : 'Viewport html',
			  tbar: [{
                 text: "按鈕1"
              },{
                 text: "按鈕2"
              }
			  ]
           }],
		   });
		     });
		 </script>

效果:

Viewport不需要再指定renderTo,而我們也看到Viewport確實填充了整個瀏覽器顯示區域,並會隨著瀏覽器顯示區域大小的改變而改改。他有三個特點:

1)、建立即可使用。不需要渲染,當元件在建立時會自動渲染到document.body節點。

2)、不能使用程式改變該控制元件的大小,也沒有滾動條。

3)、只是作為容器元件,沒有額外的屬性、方法及事件

 

Layout制定頁面的佈局方式

Fit:
在Fit佈局中,子元素將自動填滿整個父容器。注意:在fit佈局下,對其子元素設定寬度是無效的。如果在fit佈局中放置了多個元件,則只會顯示第一個子元素。典型的案例就是當客戶要求一個window或panel中放置一個GRID元件,grid元件的大小會隨著父容器的大小改變而改變。

border:
border佈局:border佈局也稱邊界佈局,他將頁面分隔為west,east,south,north,center這五個部分,我們需要在在其items中指定使用region引數為其子元素指定具體位置。

north和south部分只能設定高度(height),west和east部分只能設定寬度(width)。north south west east區域變大,center區域就變小了。

引數 split:true 可以調整除了center四個區域的大小。

引數 collapsible:true 將啟用摺疊功能, title必須設定,因為摺疊按鈕是出現標題部分的。

center 區域是必須使用的,而且center 區域不允許摺疊。Center區域會自動填充其他區域的剩餘空間。尤其在Extjs4.0中,當指定佈局為border時,沒有指定center區域時,會出現報錯資訊。
 

一般Viewport 用來做主頁面

<script type="text/javascript">
        Ext.onReady(function(){
         
		   
		    new Ext.Viewport({
               enableTabScroll: true,
				layout :'border', 
              items: [{
			  title: "NORTH",
			  region : 'north',
			  height : 50,
               html : '標題',
			  
           },{
			  title: "WEST",
			  region : 'west',
			  height : 200,
               html : '左側導航欄',
			    collapsible:true, 
			
           },{
			  xtype :'tabpanel',
			  region : 'center',
			  items : [
			  {
			  title : "center1"
			  },{
			  title : "panel2"
			  } ]
             } ],
		   });
		     });
		 </script>

效果圖:

3 對話方塊,彈出框

Ext對對話方塊進行了進一步的優化,


 <script type="text/javascript">
        
		function dalert(){
		 alert("彈出框");
		}
		function dconfirm(){
		var con = confirm("是否確定")
		alert("選擇結果:" + (con?"是":"否"))
		}
		
		function dprompt(){
		var prop =prompt("請輸入");
		alert("你輸入的是: " + prop)
		}
		
	
	 function  alertExt(){
	 Ext.MessageBox.alert("ext 彈出框")
	 }
	
	function confirmExt(){
	Ext.Msg.confirm("選擇確認","是否選擇?",function(mess){
	 Ext.MessageBox.alert("選擇結果 :"  +(mess == "yes" ? "是" : "否"))
	})
	}
	function promptExt() {
	Ext.MessageBox.prompt("姓名輸入","請輸入你的姓名:" ,function (mess,text){
	if(mess == "ok"){
	 Ext.MessageBox.alert("你輸入的是 :"  +text)
	}else{
	 Ext.MessageBox.alert("你放棄了輸入")
	}
	})
	}
	
		
		 </script>
		 
			 
<input type="button" onClick="dalert();" value ='彈出框' >  
<input type="button" onClick="dconfirm();" value ='確認框' > 
<input type="button" onClick="dprompt();"  value ='輸入框'> 
		 
		 
<input type="button" onClick="alertExt();" value ='EXT 彈出框'> 
<input type="button" onClick="confirmExt();" value ='EXT 確認框'>
<input type="button" onClick="promptExt();" value ='EXT 輸入框'> 

Ext 對話方塊一般包含四個引數:

( String title, String msg, [Function fn], [Object scope] )

其中title 為標題, msg 為提示資訊,屬於必填項

function 是回撥函式, scope 是作用於  屬於可選項

EXT 對話方塊效果 :  只在網頁中信顯示一個很小的彈出框,增加灰色遮罩

 

建立更好看的對話方塊

進度條


	function waitd(){
  var waitbox=Ext.Msg.wait("正在儲存資料,請稍候。。。","友情提示"); //顯示等待對話方塊
           waitbox.hide.defer(5000, waitbox); //隱藏對話方塊
	}

效果

 

滾動條:

	
	var i=0;
	function progress(){
	i=0;
	
	var msgbx = Ext.Msg.progress("請等待","載入頁面","資料載入中,請稍候...")  //顯示等待對話方塊

		updatep();
	}
	function updatep (){
	i+=0.1;
	Ext.Msg.updateProgress(i);
	if(i>1){
	Ext.Msg.hide();
	}else{
	updatep.defer(1000);
	}
	
	}

使用show( ) 呼叫對話方塊


	function save(){
	Ext.Msg.show({
	 title : "儲存資料",
	 msg :'是否儲存?',
	 buttons : Ext.Msg.YESNOCANCEL,
	 fn : callback,
	 icon :Ext.MessageBox.QUESTION
	});
	
	function callback (btn,text){
	if(btn == 'yes'){
	alert ("儲存完成")
	
	}else if(btn =='no'){
	alert ("沒有儲存")
	}else{
	alert("取消操作")
	}
	
	}
	
	}

 4 選項板 (tabpanel)

 

<script language="javascript">
Ext.onReady(function(){  
   new Ext.TabPanel({
		renderTo : 'div1',
        width: 300,  //當前tab的寬度
        height:400,  //當前tab的高度
		enableTabScroll:true,  //當tab較多時,會自動出現箭頭隱藏之前的tab
		 activeTab: 0, //預設選擇第一個tab
       
  
       items: [  
            {title:"面板一", html:"巢狀面板一"}, 
			 {title:"面板二", //tab的名稱
			html:"巢狀面板二", //tab的內容
			closable:'true'    //tab名稱的右上角增加刪除按鈕,點選可刪除當前tab
			},  
			{title:"面板三", html:"巢狀面板三", closable:'true'}  
        ]  
    });  
  
});  
</script>

效果

也可以直接把html中的標籤替換成TabPanel


<div id='test'>
<div class='x-tab' title='div1' >1 </div>
<div class='x-tab' title='div2'>2 </div>
	<div title='div3'>
	3
		<div class='x-tab' title='div4'>4</div> 
	</div>
</div>

<script language="javascript">
Ext.onReady(function(){  
   new Ext.TabPanel({
		applyTo : 'test',
	    activeTab: 0, //預設選擇第一個tab
		autoTabs : true,
		deferredRender : false,
		 
    });  
  
});  
</script>

必須設定 TabPanel 的屬性

把autoTabs項設定為true,把deferredRender項設定為false,然後通過applyTo項指定把頁面中包含class="x-tab"這種樣式的子節點的DOM節點應用於選項板

效果:

由於<div title='div3'> 的class 不是"x-type",所以不會解析成tab, 而<div class='x-tab' title='div4'> 雖然與 div1,div2不在一個節點下,但是仍然會被解析成tab

動態tab

<script language="javascript">
Ext.onReady(function(){  
var i=0;
   var  tabs= new Ext.TabPanel({
   
		renderTo : Ext.getBody(),
        width: 300,  //當前tab的寬度
        height:400,  //當前tab的高度
		enableTabScroll:true,  //當tab較多時,會自動出現箭頭隱藏之前的tab
		 activeTab: 0, //預設選擇第一個tab
        bbar :[
		
		{
		text : 'add',
		handler :function (){
		tabs.add({
		title : "新面板"+i++,
		closable :true 
		});
		}
		},
		{
		text : 'insert',
		handler :function (){
		tabs.insert(0,{
		title : "新面板"+i++,
		closable :true 
		});
		
		}
		},
		
		{
		text : 'delete',
		handler :function (){		
		if(tabs.activeTab.closable) {
		tabs.remove(tabs.activeTab)
		}
		}
		},
		{
		text : '關閉所有',
		handler :function (){
		
		tabs.items.each(function(p){
		if(p.closable) {
		tabs.remove(p)
		}
		} )
		
		}
		}
		
		
		],
  
        items: [  
            {title:"面板一", html:"巢狀面板一"}, 
			 {title:"面板二", //tab的名稱
			html:"巢狀面板二", //tab的內容
			closable:'true'    //tab增加刪除按鈕
			},  
			{title:"面板三", html:"巢狀面板三", closable:'true'}  
        ]  
    });  
  
});  

可以動態的增加和刪除,但是,刪除掉時候,會自動跳到初始的面板中,

5 佈局

  所謂佈局就是指容器元件中子元素的分佈、排列組合方式。Ext的所有容器元件都支援佈局操作,每一個容器都會有一個對應的佈局,佈局負責管理容器元件中子元素的排列、組合及渲染方式等

Ext中的一些容器元件都已經指定所使用的佈局,比如TabPanel使用card佈局、FormPanel使用form佈局,GridPanel中的表格使用column佈局等,我們在使用這些元件的時候,不能給這些容器元件再指定另外的佈局。

Border佈局,把容器分成東西南北中幾大區域,容器中的元素可以通過region屬性來指定子元素放置在容器中的什麼位置。
Column佈局,把子元素按列排放,通過columnWidth及width屬性來指定子元素的所佔的列寬度。
Form佈局,容器中的元素包括標題及元件內容兩項值。
Fit佈局,子元素填充整個容器區域。
Accordion佈局,摺疊佈局

6  表單(formPanel)

formPanel 繼承自panel ,在panel的基礎上提高與表單相關的各種特性, 固定使用form佈局

<script language="javascript">
 Ext.onReady(function(){
           new Ext.form.FormPanel({
		    renderTo :Ext.getBody(),
             title : '資訊錄入',
              height: 200,
              width: 300,
               labelWidth : 60,
              labelAlign: "right",
              frame: true,
               defaults : {
		    xtype : 'textfield',
			width :180
		  },
              items: [
                 {name: "username", fieldLabel: "姓名"},
                 {name: "password", fieldLabel: "密碼", inputType: "password"},
                 {name: "email", fieldLabel: "電子郵件"},
                 {xtype: "textarea", name: "intro", fieldLabel: "簡介"}
              ],
              buttons:[{text:"提交"}, {text:"取消"}]
           });
        });
</script>

結果:

其中: 

new Ext.form.FormPanel  來建立表單面板, labelWid表單中標籤的寬度,labelAlign 指定欄位標籤的對齊方式

defaults 中指定該容器中所有子元素預設型別都是 textfield(文字框), 在items定義的子元素中, 都包含一個name屬性,相當於

input 標籤中的name屬性, fieldLabel 指定欄位標籤,

BasicForm 

  formPanel 包含一個form屬性,該屬性是一個 Ext.form.BasicForm 型別的物件,可以直接訪問,也可以通過 getForm()方法得到.

BasicForm 表示基本的表單,包含了submit ,load,reset等方法,用來代替 html中<form>標籤中的submit,reset等方法,通過呼叫這些方法可以實現表單提交,資訊重置等操作;

 優化上個示例

 buttons:[
			  {
			  text:"提交",
			  handler : function (){
			  f.form.submit({
			  waitTtle : '資料提交',
			  waitMsg : '表單提交中,請稍候...'
			  });
			  }
			  }, {
			  text:"重置",
			  handler : function (){
			  f.form.reset();
			  }
			  }]

能夠模擬表單提交,重置功能

 

表單元素 Field 

field 代表各種各樣的資料錄入項, 在程式中,一般直接使用 field的子類, 包括Checkbox, CheckboxGroup, CompositeField, DisplayField, Hidden, HtmlEditor, SliderField, TextField等。

field元件一般包括一個fieldLabel屬性和一個name屬性

表格(GridPanel)

  表格由類Ext.grid.GridPanel定義,繼承自Panel,其xtype為grid。

ExtJS中,表格Grid必須包含列定義資訊,並指定表格的資料儲存器Store。

表格的列資訊由類Ext.grid.Column(以前是由Ext.grid.ColumnModel定義)

表格的資料儲存器由Ext.data.Store定義,資料儲存器根據解析的資料不同分為JsonStore、SimpleStroe、GroupingStore等。


<script language="javascript">
 Ext.onReady(function(){
			var  data =[
			
			[0,'c語言','C語言程式設計','張老師'],
			[1,'c++','c++程式設計','李老師'],
			[2,'java','java課程設計','劉老師'],
			[3,'作業系統','作業系統入門','吳老師']
			];
		var store = new Ext.data.SimpleStore({
		  data : data,
		  fields : ['id','names','course','teacher']
		
		});
		
		var grid =new Ext.grid.GridPanel({
		renderTo : Ext.getBody(),
		title  : '程式設計課程'	,
		height : 500,
		width : 400,
		columns :[
		{header : '編號',dataIndex : 'id'},
		{header : '名稱',dataIndex : 'names'},
		{header : '課程',dataIndex : 'course'},
		{header : '老師',dataIndex : 'teacher'},
		],
		store : store,
		autoExplandColumn : 2
		});
		
 })

</script>

效果:

其中:  dataIndex 的值要與store中的fields相對應

 

TreePanel 

同步樹:

<script language="javascript">
 Ext.onReady(function(){
 
			var  rootNode= new Ext.tree.TreeNode({
			id :"root",
			text : "根節點"
			});
			var childNode =new Ext.tree.TreeNode({
			id :"c1",
			text : "子節點"
			});
			
			rootNode.appendChild(childNode);
			
		var store = new Ext.tree.TreePanel({
		 renderTo : Ext.getBody(),
		 root :  rootNode,
		 width: 100
		
		});
		
 })

</script>

TreeNode 表示一個樹節點,常用屬性有:

 id , text , icon, checked