1 2.1 面向對象的基礎架構(對象模型) 2 2.1.1 創建類 3 >.定義一個類: 4 Ext.define('demo.Demo',{ 5 name:'Lingo', 6 hello:function () { 7 return 'Hello'+this.name; 8 } 9 }); 10 //第一個參數是字符串類型的類名; 11 //第二個參數是object類型,其中可以填寫這個類型的字段和函數; 12 >.創建一個對象: 13 var demo = new demo.Demo(); 14 15 2.1.2 對象繼承(extend) 16 Ext.define('demo.DemoWindow',{ 17 extend:'Ext.Window', //繼承Ext.Window的所有功能; 18 title:'demo title', //擴展(設置標題); 19 initComponent:function(){ //初始化時默認添加兩個子組件; 20 Ext.apply(this,{ //apply()將一批屬性批量復制給當前對象; 21 items:[{html:'panel1'},{html:'panel2'}] 22 }); 23 this.callParent(); //callParent()函數實現對父類函數的快捷調用; 24 } 25 }); 26 27 2.1.3 多重繼承(mixin) 28 Ext.define('demo.DemoPanel',{ 29 extend:'Ext.Window', //單根繼承 30 mixins:['demo.Demo'] //混入(多重繼承);將類'demo.Demo'的屬性都復制給新類; 31 }); 32 33 2.1.4 自動生成代碼 34 Ext.define('demo.DemoObject',{ 35 statices:{ TYPE_DEFAULT : 0 }, //設置靜態成員,無須創建對象即可直接調用的屬性或函數; 36 constructor: function() { //在創建對象時執行初始化的構造函數; 37 //do some init; 38 } 39 })
1 2.2 統一的組件模型 2 2.2.1 Ext.Component 3 //所有Ext組件的基類,組件下所有的子類都可能參與自動化Ext組件的生命周期,執行創建/渲染和銷毀; 4 var box = new Ext.Component({ 5 el: 'test', 6 style: 'background-color:red; position:absoulte', 7 pageX: 100, 8 pageY: 50,, 9 width: 200, 10 height: 150 11 }); 12 box.render(); 13 14 2.2.2 Ext.Panel 15 //Ext.Panel繼承自Ext.Container;也可無須繼承即可直接使用; 16 var panel = new Ext.Panel({ 17 el:'test', 18 title:'測試標題', 19 floating:true, 20 shadow:true, 21 draggable:true, 22 collapsible:true, 23 html:'測試內容', 24 pageX:100, 25 pageY:50, 26 width:200, 27 height:150 28 }); 29 panel.render(); 30 31 2.2.3 Ext.Container 32 //繼承自Ext.Component;所有可布局組件的超類; 33 //參數layout:指定當前組件使用何種布局; 34 //參數items:包含的是當前組件中所有子組件; 35 new Ext.Viewport({ 36 layout:'border', 37 items:[{ 38 xtype:'panel' 39 region:'north' 40 },{ 41 region:'south' 42 },{ 43 region:'west' 44 },{ 45 region:'east' 46 },{ 47 region:'center' 48 }] 49 });
1 2.3 完善的事件機制(事件模型) 2 2.3.1 自定義事件 3 //所有繼承自Ext.util.Observable類的控件都可以支持事件; 4 //為這些類的對象定義一些事件,為事件配置監聽器; 5 //當某個事件被觸發,Ext會自動調用對應的監聽器,這就是Ext事件模型; 6 >1.Person類 7 Person = function(name){ 8 this.name = name; 9 this.addEvents("walk","eat","sleep"); 10 //初始化時調用addEvents()定義了3個事件; 11 } 12 Ext.extend(Person,Ext.util.Observable,{ 13 //Person繼承Observable所有屬性; 14 info:function(){ 15 return this.name+"is"+event+"ing."; 16 } 17 }); 18 >2.為person添加事件監聽器 19 var person = new Person('Lingo'); 20 person.on('walk',function(){ 21 //on()是addListener()的簡寫形式; 22 //參數一:傳遞事件名稱; 23 //參數二:事件發生時執行的函數; 24 Ext.Msg.alert('event',person.name+"在走啊走.") 25 }); 26 >3.觸發person的事件 27 Ext.get('walk').on('click',function(){ 28 //給walk按鈕綁定點擊事件; 29 person.fireEvent('walk'); 30 //fireEvent()傳入一個事件名稱作為參數,該事件對應的監聽函數就會執行; 31 }); 32 33 2.3.2 瀏覽器事件 34 //Ext使用Ext.EventManager/Ext.EventObject/Ext.libEvent對原生瀏覽器事件進行封裝; 35 //原生事件處理是通過單一的綁定實現的,但每次只能給一個事件綁定一個事件處理函數; 36 //而Ext可以將同一個事件依次綁定到多個事件處理句柄上; 37 Ext.onReady(function(){ 38 var test = Ext.get('test'); 39 //Ext.get('test'):獲得HTML中id="test"對應的按鈕; 40 test.on('click',function(){ 41 alert("handle1"); 42 }); 43 test.on('click',function(){ 44 alert("handle2"); 45 }); 46 }); 47 48 2.3.3 Ext.EventObjectImpl 49 //Ext.EventObjectImpl是對事件的封裝,將Ext自定義事件和瀏覽器事件結合在一起使用; 50 //它封裝不同瀏覽器的事件處理函數,為上層組件提供了統一的功能接口; 51 >1.getX()/getY()/getXY():獲得發生的事件在頁面中的坐標位置; 52 >2.getTarget():返回事件的目標元素; 53 >3.on()/un():事件的綁定與清除; 54 >4.purgeElement():把元素上的所有事件都清除; 55 >5.preventDefault():取消瀏覽器對當前事件所執行的默認操作; 56 >6.stopPropagation():停止事件傳遞;(阻止冒泡); 57 >7.stopEvent():停止一個事件;(內部調用preventDefault()和stopPropagation()兩個函數,取消瀏覽器的默認操作,同時停止事件傳遞); 58 >8.getRelatedTarget():返回與當前事件相關的元素; 59 >9.getWheelDelta():獲取鼠標滾輪的delta值; 60 Ext.get('test').on('keypress',function(e){ 61 //監聽函數的參數e就是一個Ext.EventObjectImpl 62 if(e.charCode == Ext.EventObjectImpl.SPACE){ 63 Ext.Msg.alert('info','空格'); 64 } 65 }); 66 67 2.3.4 Ext.util.Observable 68 //位於Ext組件的頂端,為Ext組件提供處理事件最基本的功能; 69 //實現一個可以處理事件的Ext組件,最直接的方法就是繼承Ext.util.Observable; 70 >1.復合式參數 71 Ext.get('test').on('click',fn,this,{ 72 //click:事件名稱; fn:click事件觸發時執行的函數; this:fn執行時的作用域是this; 73 single:true, //表示這個事件處理函數僅執行一次; 74 delay:100, //延遲100ms后執行; 75 testId:4, 76 buffer:1000 //延遲執行,但會創建一個Ext.util.DelayTask對象;並把fn放入其中等待執行;若再次觸發事件,則上一個fn會被取消,執行新的fn;這樣保證fn不會重復執行多次; 77 }); 78 var fn = function(e,el,args){ 79 alert('handlel'); 80 alert(args.testId); 81 //在事件監聽函數中獲得在符合函數參數中定義的數據; 82 } 83 >2.一次性定義多個事件監聽器 84 Ext.get('test').on({ 85 'click':{fn:fn}, 86 'mouseover':{ 87 fn:fn, 88 single:true, 89 delay:100 90 } 91 }); 92 >3.captrue()攔截函數 93 Ext.get('capture1').on('click',function(){ 94 Ext.util.Observable.capture(person,function(){ 95 alert('capture1'); 96 return true; //不會終止事件的發生; 97 //return false; //終止事件; 98 }); 99 }) 100 //通過控制capture()中處理函數的返回值來決定是繼續執行某個事件的監聽函數,還是直接終止; 101 //可以為一個對象設置多個capture()攔截函數;形成處理鏈; 102 >4.releaseCapture() 103 //清除fireEvent()上所有的攔截函數; 104 >5.suspendEvents()暫停函數 105 Ext.get('test').on('click',function(){ 106 person.suspendEvents(); 107 }) 108 >6.resumeEvents()繼續函數; 109 Ext.get('test').on('click',function(){ 110 person.resumeEvents(); 111 }) 112 113 2.3.5 Ext.EventManager 事件管理器 114 //定義了一系列與事件相關的處理函數; 115 >1.Ext.onReady() 116 //等頁面文檔渲染完畢但圖片等還沒下載時調用啟動函數; 117 Ext.onReady(function(){ 118 Ext.Msg.alert('message',Ext.get('test')); 119 //頁面渲染之后獲取id="test"的Element對象; 120 }); 121 >2.onWindowResize() 122 //監聽瀏覽器窗口大小變化; 123 Ext.EventManager.onWindowResize(function(width,height){ 124 alert('width:'+width+'height:'+height); 125 });
1 2.4 小結 2 Ext基本功能架構,包括對象模型/組件模型和事件模型;Ext中所有的功能都建立在這些基本架構之上;
