自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

移花接木 實(shí)例講解Ext JS控件的擴(kuò)展

開發(fā) 前端
本文介紹了Ext的基本概念以及擴(kuò)展Ext的一般方法,通過(guò)三個(gè)應(yīng)用場(chǎng)景,詳細(xì)描述了如何從已有的Ext控件出發(fā),借鑒其他控件的功能,開發(fā)出滿足實(shí)際需要的新控件。本文的目的,旨在拋磚引玉,希望能給初學(xué)Ext的同仁們一點(diǎn)啟發(fā)和參考,開發(fā)出更多、功能更強(qiáng)大的組件。

Ext JS是一種強(qiáng)大的JavaScript庫(kù),可以用來(lái)開發(fā)RIA(Rich Internet Applications),也即富客戶端的Ajax應(yīng)用,是一個(gè)與后臺(tái)技術(shù)無(wú)關(guān)的前端Ajax框架。

Ext JS最開始基于YUI(Yahoo!UserInterfaceLibrary)技術(shù),由開發(fā)人員JackSlocum開發(fā),通過(guò)參考JavaSwing等機(jī)制來(lái)組織可視化組件,無(wú)論從UI界面上CSS樣式的應(yīng)用,到數(shù)據(jù)解析上的異常處理,都可算是一個(gè)非常優(yōu)秀的Web開發(fā)框架。

對(duì)于大多數(shù)程序員來(lái)說(shuō),我們沒有任何美術(shù)功底,公司的很多項(xiàng)目也沒有配備美工,要想開發(fā)吸引人眼球的用戶界面,一直以來(lái)不是一件容易的事情。但是Ext的出現(xiàn)使得開發(fā)美觀的界面變得容易,Ext提供了表格、樹、布局、按鈕等很多外觀絢麗、功能強(qiáng)大的控件,為我們的日常開發(fā)工作節(jié)約了大量的時(shí)間和精力。更重要的是這個(gè)框架是完全面向?qū)ο笄铱蓴U(kuò)展的,通過(guò)對(duì)現(xiàn)有的庫(kù)的功能進(jìn)行修改或加入新的功能,來(lái)實(shí)現(xiàn)Ext框架中沒有的功能。

擴(kuò)展Ext組件

擴(kuò)展(extension)在Ext中就是指衍生的子類。假設(shè)我們已經(jīng)有一個(gè)附有一些方法的基類,現(xiàn)在欲加入新方法。我們可以利用框架的繼承特性和JavaScript創(chuàng)建新類的語(yǔ)言特性組合新的一個(gè)類。

Ext提供了這樣的一個(gè)實(shí)用函數(shù)Ext.extend在Ext框架中實(shí)現(xiàn)類繼承的機(jī)制。這賦予了擴(kuò)展任何JavaScript基類的能力,而無(wú)須對(duì)類自身進(jìn)行代碼的修改,擴(kuò)展Ext組件這是個(gè)較理想的方法。

要從一個(gè)現(xiàn)有的類創(chuàng)建出一個(gè)新類,首先要通過(guò)一個(gè)函數(shù)聲明新類的構(gòu)造器,然后調(diào)用新類屬性所共享的擴(kuò)展方法。這些共享的屬性通常是方法,但是如果要在實(shí)例之間共享數(shù)據(jù),應(yīng)該也一同聲明。

JavaScript并沒有提供一個(gè)自動(dòng)的調(diào)用父類構(gòu)造器的機(jī)制,所以必須通過(guò)屬性superclass在構(gòu)造器中顯式調(diào)用父類。***個(gè)參數(shù)總是this,以保證構(gòu)造器工作在調(diào)用函數(shù)的作用域。

  1. 清單1.擴(kuò)展Ext組件的基本方法  
  2.       
  3. MyNewClass=function(arg1,arg2,etc){  
  4. //顯式調(diào)用父類的構(gòu)造函數(shù)  
  5. MyNewClass.superclass.constructor.call(this,arg1,arg2,etc);  
  6. };  
  7. Ext.extend(MyNewClass,SomeBaseClass,{  
  8. myNewFn1:function(){  
  9. //etc.  
  10. },  
  11. myNewFn2:function(){  
  12. //etc.  
  13. }  
  14. }); 

使用時(shí),我們需要實(shí)例化對(duì)象:

  1. 清單2.實(shí)例化新的組件對(duì)象  
  2.       
  3. varmyObject=newMyNewClass(arg1,arg2,etc); 

掌握了擴(kuò)展Ext組件的基本方法之后,我們就可以隨意構(gòu)造滿足特定需求的組件。然而Ext里已有的組件和示例永遠(yuǎn)是我們?nèi)≈槐M,用之不竭的創(chuàng)造源泉。本文以三個(gè)Ext組件為基礎(chǔ),“嫁接”了其他組件的功能,形成三個(gè)新的組件,實(shí)現(xiàn)了現(xiàn)有Ext組件沒有的功能。本文的目的,旨在拋磚引玉,希望能給初學(xué)Ext的同仁們一點(diǎn)啟發(fā)和參考,開發(fā)出更多、功能更強(qiáng)大的組件。

#p#

移Property Grid之花接EditorGrid之木

首先,介紹一下我們的場(chǎng)景和實(shí)際需求。某大學(xué)要建設(shè)一個(gè)教職工科研基金的管理系統(tǒng),該系統(tǒng)可供基金設(shè)置人員設(shè)置基金申請(qǐng)條件、發(fā)放步驟等,申請(qǐng)人員填報(bào)申請(qǐng)人信息、申領(lǐng)基金等。這里以構(gòu)建一個(gè)基金申請(qǐng)條件的組件為例。條件制定人員在制定申請(qǐng)條件時(shí),可以隨意添加、刪除申請(qǐng)條件;對(duì)于某些申請(qǐng)條件,比如院系、性別等要求系統(tǒng)能提供預(yù)先定義好的選項(xiàng)供條件制定人員選擇,而對(duì)于比如特長(zhǎng)、年齡等內(nèi)容不明確的或者選項(xiàng)過(guò)多無(wú)法列舉的情況,則直接提供輸入框供條件制定人員輸入。

為了用Ext構(gòu)建這樣的組件,我們首先想到的是選用EditorGrid組件或者Property Grid組件。EditorGrid(可編輯表格控件)擴(kuò)展自GridPanel,提供對(duì)于選中列的單元格編輯??删庉嫷牧惺峭ㄟ^(guò)在表示表格的列信息的類Ext.grid.ColumnModel中添加editor來(lái)實(shí)現(xiàn)的。但是這個(gè)editor是對(duì)整個(gè)列有效的,就是說(shuō)每一行在該列的位置的數(shù)據(jù)的編輯器是一樣的。

Property Grid(屬性表格)擴(kuò)展自EditorGridPanel,所以可以直接編輯右邊屬性值部分的內(nèi)容。但是,只是右邊的,即使你單擊左邊的單元格,編輯器也只會(huì)出現(xiàn)在右邊。實(shí)際上,我們可以用散列表來(lái)形容Property Grid,左邊可以看作key,右邊的是value。key是由我們指定好的,用戶只需要修改對(duì)應(yīng)的value即可。

Property Grid默認(rèn)的編輯器包括TextField、DateField、NumberField和ComboBox,也就只能處理數(shù)字、字符串的輸入和日期的選擇,布爾值的選擇等一般的情況。當(dāng)我們想對(duì)編輯器進(jìn)行更詳細(xì)的配置時(shí),就需要用到Property Grid的customEditors,為指定id的那行數(shù)據(jù)設(shè)置對(duì)應(yīng)的編輯器。customEditors和source的設(shè)置基本一樣,只需要將兩者的屬性名稱對(duì)應(yīng)起來(lái),并且為customEditors里的所有屬性指定一個(gè)editor。

Property Grid雖然能夠給不同的單元格定制不同的編輯器,但是一方面這種表格只有兩列,***列還不可編輯,而且表格的內(nèi)容(source)需要事先確定;另一方面定義customEditors的時(shí)候必須知道表格的內(nèi)容(source),而且必須將兩者的屬性名稱對(duì)應(yīng)起來(lái)。EditorGrid其實(shí)已經(jīng)大部分滿足了我們的需求,只是不能對(duì)每個(gè)單元格定制編輯器,只能指定列編輯器。

經(jīng)過(guò)上面的分析,單純的使用任何一個(gè)控件,都難以達(dá)到我們的目的。同時(shí)我們發(fā)現(xiàn)問(wèn)題主要出在EditorGrid的列模式(ColumnModel)上,Property Grid就是擴(kuò)展自EditorGrid,通過(guò)對(duì)其ColumnModel的擴(kuò)展來(lái)支持單元格的編輯器。所以我們嘗試把EditorGrid的ColumnModel擴(kuò)展一下,使得新的ColumnModel支持customEditors,這樣我們就獲得了對(duì)編輯器的完全控制權(quán),可以根據(jù)表格的內(nèi)容動(dòng)態(tài)的改變單元格的編輯器了。清單3是我們?yōu)闈M足上述需求而擴(kuò)展的新類MyColumnModel的部分代碼,清單4是使用MyColumnModel構(gòu)造了一個(gè)EditorGrid作為基金申請(qǐng)條件組件。

  1. 清單3.定義新類MyColumnModel  
  2.       
  3. Ext.ns('Ext.ux.grid');  
  4. //新類MyColumnModel的構(gòu)造函數(shù)  
  5. Ext.ux.grid.MyColumnModel=function(grid,store,column){  
  6. this.grid=grid;  
  7. this.store=store;  
  8.  
  9. vargender=[  
  10. ['0100','男'],  
  11. ['0101','女']  
  12. ];  
  13. vardepartment=[  
  14. ['0200','文學(xué)院'],  
  15. //省略部分代碼  
  16. ['0207','醫(yī)學(xué)部']  
  17. ];  
  18. vartitle=[  
  19. ['0300','助教'],  
  20. //省略部分代碼  
  21. ['0303','教授']  
  22. ];  
  23. vargenderCombo=newExt.form.ComboBox({  
  24. store:newExt.data.SimpleStore({  
  25. fields:['value','text'],  
  26. data:gender  
  27. }),  
  28. emptyText:'請(qǐng)輸入',  
  29. mode:'local',  
  30. triggerAction:'all',  
  31. valueField:'value',  
  32. displayField:'text',  
  33. readOnly:true  
  34. });  
  35. vardepartmentCombo=newExt.form.ComboBox({  
  36. store:newExt.data.SimpleStore({  
  37. fields:['value','text'],  
  38. data:department  
  39. }),  
  40. //與上面定義genderCombo類似,故省略部分代碼  
  41. …  
  42. });  
  43. vartitleCombo=newExt.form.ComboBox({  
  44. store:newExt.data.SimpleStore({  
  45. fields:['value','text'],  
  46. data:title  
  47. }),  
  48. //與上面定義genderCombo類似,故省略部分代碼  
  49. …  
  50. });  
  51. //當(dāng)選擇“性別”、“院系”、“職稱”時(shí),提供相應(yīng)的下拉列表作為單元格編輯器,  
  52. 供用戶選擇;當(dāng)選擇“年齡”、“論文數(shù)量”時(shí),提供數(shù)字文本框供用戶輸入  
  53. this.customEditors={  
  54. 'GENDER':newExt.grid.GridEditor(genderCombo),  
  55. 'DEPARTMENT':newExt.grid.GridEditor(departmentCombo),  
  56. 'TITLE':newExt.grid.GridEditor(titleCombo),  
  57. 'AGE':newExt.grid.GridEditor(newExt.form.NumberField({selectOnFocus:true,  
  58. style:'text-align:left;'})),  
  59. 'PAPER':newExt.grid.GridEditor(newExt.form.NumberField({selectOnFocus:true,  
  60. style:'text-align:left;'}))  
  61. };  
  62. Ext.ux.grid.MyColumnModel.superclass.constructor.call(this,column);  
  63. }; 
  1. Ext.extend(Ext.ux.grid.MyColumnModel,Ext.grid.ColumnModel,{  
  2. //通過(guò)覆蓋父類中的方法getCellEditor,實(shí)現(xiàn)根據(jù)表達(dá)式中條件列的不同取值,  
  3. 為表達(dá)式的值所在單元格返回不同的編輯器  
  4. getCellEditor:function(colIndex,rowIndex){  
  5. varp=this.store.getAt(rowIndex);  
  6. n=p.data.attrName;//對(duì)應(yīng)表達(dá)式的條件列的取值  
  7.  
  8. if(colIndex==4)//表達(dá)式的值propertyValue所在的列  
  9. {  
  10. if(this.customEditors[n]){  
  11. returnthis.customEditors[n];  
  12. }else{  
  13. //如果沒有定義特定的單元格編輯器,則返回普通的文本框編輯器  
  14. vared=newExt.grid.GridEditor(newExt.form.TextField({  
  15. selectOnFocus:true  
  16. })  
  17. );  
  18. returned;  
  19. }  
  20. }  
  21. else  
  22. returnthis.config[colIndex].editor;  
  23. }  
  24. }); 

 #p#

  1. 清單4.基金申請(qǐng)條件組件  
  2.       
  3. Ext.onReady(function(){  
  4. varcomboData1=[  
  5. ['AGE','年齡'],  
  6. //省略部分代碼  
  7. ['DEPARTMENT','院系']  
  8. ];  
  9. varcomboData2=[  
  10. ['>','大于'],  
  11. //省略部分代碼  
  12. ['!=','不等于']  
  13. ];  
  14. varcombo1=newExt.form.ComboBox({  
  15. id:'attrCombo',  
  16. store:newExt.data.SimpleStore({  
  17. fields:['value','text'],  
  18. data:comboData1  
  19. }),  
  20. emptyText:'請(qǐng)選擇',  
  21. mode:'local',  
  22. triggerAction:'all',  
  23. valueField:'value',  
  24. displayField:'text',  
  25. readOnly:true  
  26. });  
  27. varcombo2=newExt.form.ComboBox({  
  28. id:'operatorCombo',  
  29. store:newExt.data.SimpleStore({  
  30. fields:['value','text'],  
  31. data:comboData2  
  32. }),  
  33. //與上面定義combo1類似,故省略部分代碼  
  34. …  
  35. });  
  36.  
  37. varconditiondata=[];  
  38. vargStore=newExt.data.SimpleStore({  
  39. fields:[  
  40. {name:'fundConditionId'},  
  41. {name:'attrName'},  
  42. {name:'operator'},  
  43. {name:'propertyValue'}  
  44. ],  
  45. data:conditiondata  
  46. });  
  47. varsm=newExt.grid.CheckboxSelectionModel({handleMouseDown:Ext.emptyFn});  
  48. varcolumn=[  
  49. sm,  
  50. {  
  51. header:'條件id',  
  52. dataIndex:'fundConditionId',  
  53. hidden:true  
  54. },{  
  55. header:'屬性名稱',  
  56. dataIndex:'attrName',  
  57. editor:newExt.grid.GridEditor(combo1),  
  58. //attributeRenderer方法是用來(lái)格式化輸出的函數(shù),這里從略。  
  59. renderer:attributeRenderer.createDelegate(this,["properties"],0)  
  60. },{  
  61. header:'操作符',  
  62. dataIndex:'operator',  
  63. editor:newExt.grid.GridEditor(combo2),  
  64. renderer:attributeRenderer.createDelegate(this,["operators"],0)  
  65. },{  
  66. header:'屬性值',  
  67. dataIndex:'propertyValue',  
  68. editor:newExt.grid.GridEditor(newExt.form.TextField({selectOnFocus:true})),  
  69. renderer:attributeRenderer.createDelegate(this,["values"],0)  
  70. }  
  71. ];  
  72.  
  73. varfundConditionGrid=newExt.grid.EditorGridPanel({  
  74. name:'fundCondition',  
  75. id:'fundCondition',  
  76. store:gStore,  
  77. cm:newExt.ux.grid.MyColumnModel(this,gStore,column),  
  78. sm:sm,  
  79. tbar:newExt.Toolbar(['-',{  
  80. text:'添加條件',  
  81. //_onAddCondition方法是按鈕“添加條件”的響應(yīng)函數(shù),實(shí)現(xiàn)在列表中增加一個(gè)條件的功能,這里從略。  
  82. handler:_onAddCondition.createDelegate(this)  
  83. },'-',{  
  84. text:'刪除條件',  
  85. //_onRemoveCondition方法是按鈕“刪除條件”的響應(yīng)函數(shù),實(shí)現(xiàn)在列表中刪除一個(gè)條件的功能,這里從略。  
  86. handler:_onRemoveCondition.createDelegate(this)  
  87. },'-']),  
  88. frame:true,  
  89. collapsible:true,  
  90. animCollapse:false,  
  91. title:'助研基金申請(qǐng)條件',  
  92. width:350,  
  93. height:300,  
  94. iconCls:'icon-grid',  
  95. clicksToEdit:1,  
  96. renderTo:'example1'  
  97. });  
  98. }); 

當(dāng)屬性名稱選擇性別、職稱或者院系時(shí),屬性值分別對(duì)應(yīng)不同的下拉列表供用戶選擇,當(dāng)屬性名稱選擇年齡或者論文數(shù)量時(shí),屬性值則對(duì)應(yīng)數(shù)字文本框供用戶輸入。如圖1-圖5所示。

編輯助研基金申請(qǐng)條件 
圖1.編輯助研基金申請(qǐng)條件1

編輯助研基金申請(qǐng)條件2 
圖2.編輯助研基金申請(qǐng)條件2

編輯助研基金申請(qǐng)條件3 
圖3.編輯助研基金申請(qǐng)條件3

編輯助研基金申請(qǐng)條件4 
圖4.編輯助研基金申請(qǐng)條件4

編輯助研基金申請(qǐng)條件5 
圖5.編輯助研基金申請(qǐng)條件5

這里表示計(jì)算機(jī)學(xué)院年齡不大于35歲講師以上(含)職稱的女教師,如果發(fā)表的論文數(shù)量多于10篇的,有資格申請(qǐng)?jiān)撝谢???梢钥闯鲈摶痼w現(xiàn)了對(duì)優(yōu)秀青年女教師的科研支持。此部分的代碼請(qǐng)參考示例代碼中的Example1.js。

 #p#

用ComboBox實(shí)現(xiàn)在光標(biāo)處插入文本

在上述的教職工科研基金管理系統(tǒng)中,如果滿足基金申請(qǐng)條件的教職工人數(shù)很多,我們就需要根據(jù)某種評(píng)分機(jī)制對(duì)申請(qǐng)人進(jìn)行評(píng)分,然后按分?jǐn)?shù)從高到低擇優(yōu)選擇。這里以構(gòu)建一個(gè)制定申請(qǐng)人得分計(jì)算公式的組件為例。制定計(jì)算公式時(shí),可以引用上面系統(tǒng)中已經(jīng)定義好的申請(qǐng)條件作為計(jì)分要素,然后用加減乘除等運(yùn)算符將計(jì)分要素和比例系數(shù)連接起來(lái)構(gòu)成得分計(jì)算公式。

為實(shí)現(xiàn)上面的功能,我們考慮在文本框的右邊放一個(gè)按鈕,點(diǎn)擊該按鈕,列出所有的計(jì)分要素,選擇一個(gè)計(jì)分要素后,在文本框中光標(biāo)所在位置插入該計(jì)分要素。列出所有的計(jì)分要素,并選擇其一,***的實(shí)現(xiàn)方式是ComboBox,但是使用ComboBox,選擇的值會(huì)覆蓋文本框內(nèi)所有的文字,無(wú)法實(shí)現(xiàn)在光標(biāo)處插入文本的功能。

所以我們決定擴(kuò)展ComboBox,使得新的ComboBox支持在光標(biāo)處插入文本。清單5是我們?yōu)闈M足上述需求而擴(kuò)展的新類valueCombo的部分代碼,清單6是使用valueCombo作為申請(qǐng)人得分計(jì)算公式組件。效果如圖6和圖7所示。

插入計(jì)分要素編輯評(píng)分計(jì)算公式 
圖6.插入計(jì)分要素編輯評(píng)分計(jì)算公式

評(píng)分計(jì)算公式 
圖7.評(píng)分計(jì)算公式

  1. 清單5.定義新類valueCombo  
  2.       
  3. Ext.ns('Ext.ux.form');  
  4.  
  5. ExtExt.ux.form.valueCombo=Ext.extend(Ext.form.ComboBox,{  
  6. initComponent:function(){  
  7. Ext.ux.form.valueCombo.superclass.initComponent.call(this);  
  8. },  
  9. setValue:function(v){  
  10. vvartext=v;  
  11. //直接顯示選項(xiàng)的值,不做格式化轉(zhuǎn)換,覆蓋原來(lái)ComboBox的格式化顯示的功能  
  12. /*if(this.valueField){  
  13. varr=this.findRecord(this.valueField,v);  
  14. if(r){  
  15. text=r.data[this.valueField];  
  16. }elseif(Ext.isDefined(this.valueNotFoundText)){  
  17. text=this.valueNotFoundText;  
  18. }  
  19. }*/  
  20. this.lastSelectionText=text;  
  21. if(this.hiddenField){  
  22. this.hiddenField.value=v;  
  23. }  
  24. Ext.ux.form.ComboBox.superclass.setValue.call(this,text);  
  25. this.value=v;  
  26. returnthis;  
  27. },  
  28. //private  
  29. onSelect:function(record,index){  
  30. if(this.fireEvent('beforeselect',this,record,index)!==false){  
  31. varstr=record.data[this.valueField||this.displayField];  
  32. //實(shí)現(xiàn)在光標(biāo)處插入文本的功能  
  33. vartc=this.getRawValue();  
  34. vartclen=this.getRawValue().length;  
  35. this.focus();  
  36. //以下代碼只對(duì)Firefox生效  
  37. if(typeofdocument.selection!="undefined")  
  38. {  
  39. document.selection.createRange().text=str;  
  40. }  
  41. else  
  42. {  
  43. this.setValue(tc.substr(0,this.el.dom.selectionStart)+str  
  44. +tc.substring(this.el.dom.selectionStart,tclen));  
  45. }  
  46. this.collapse();  
  47. this.fireEvent('select',this,record,index);  
  48. }  
  49. },  
  50. onLoad:function(){  
  51. if(!this.hasFocus){  
  52. return;  
  53. }  
  54. if(this.store.getCount()>0){  
  55. this.expand();  
  56. this.restrictHeight();  
  57. if(this.lastQuery==this.allQuery){  
  58. //if(this.editable){  
  59. //this.el.dom.select();為了保持光標(biāo)位置,注釋掉此段代碼  
  60. //}  
  61. if(!this.selectByValue(this.value,true)){  
  62. this.select(0,true);  
  63. }  
  64. }else{  
  65. this.selectNext();  
  66. if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE  
  67. &&this.lastKey!=Ext.EventObject.DELETE){  
  68. this.taTask.delay(this.typeAheadDelay);  
  69. }  
  70. }  
  71. }else{  
  72. this.onEmptyResults();  
  73. }  
  74. //this.el.focus();  
  75. },  
  76. initQuery:function(){  
  77. //屏蔽掉下拉列表進(jìn)行匹配查詢的功能  
  78. //this.doQuery(this.getRawValue());  
  79. }  
  80. }); 

 

  1. 清單6.申請(qǐng)人得分計(jì)算公式組件  
  2.       
  3. varcomboData=[  
  4. ['AGE','年齡'],  
  5. //省略部分代碼  
  6. ['DEPARTMENT','院系']  
  7. ];  
  8. varscoreExpression=newExt.ux.form.valueCombo({  
  9. width:250,  
  10. listWidth:120,  
  11. fieldLabel:‘得分計(jì)算公式’,  
  12. mode:'local',  
  13. valueField:'value',  
  14. displayField:'text',  
  15. triggerAction:'all',  
  16. store:newExt.data.SimpleStore({  
  17. fields:['value','text'],  
  18. data:comboData  
  19. }),  
  20. triggerConfig:{tag:"img",src:"../images/score-element.jpg",  
  21. cls:"x-textfield-button-trigger"}  
  22. }); 

該計(jì)算公式體現(xiàn)了對(duì)青年教職工和女性教職工的鼓勵(lì)和扶助。此部分的代碼請(qǐng)參考示例代碼中的Example2.js。

 #p#

實(shí)現(xiàn)帶ComboBox的TwinTriggerField

在上述的教職工科研基金管理系統(tǒng)中,需要一個(gè)查詢員工詳細(xì)信息的控件。只要輸入員工號(hào)或者從下拉列表中選擇一個(gè)員工號(hào),就能自動(dòng)載入該員工所有的信息。同時(shí)希望能根據(jù)搜索條件查詢符合條件的員工,從中選擇某個(gè)員工,查看他的詳細(xì)信息。

依據(jù)這個(gè)需求,我們要構(gòu)建一個(gè)查詢員工的組件,當(dāng)在文本框中輸入員工號(hào)前幾位能自動(dòng)列出所有相關(guān)員工號(hào),或者直接從下拉框中選擇一個(gè)員工號(hào),隨后自動(dòng)載入員工信息;當(dāng)點(diǎn)擊文本框右邊的搜索按鈕,打開新的窗口,在新窗口中能夠根據(jù)員工職位、院系、出生日期所在范圍等進(jìn)行搜索,選中員工之后,也會(huì)自動(dòng)載入該員工的信息。如果能將ComboBox和TwinTriggerField的功能結(jié)合起來(lái),將是實(shí)現(xiàn)此需求的最直接、最便利的方法。

清單7是我們?yōu)闈M足上述需求而擴(kuò)展的新類ComboSearchField的部分代碼,清單8是使用ComboSearchField構(gòu)造了一個(gè)Form作為教職工信息查詢控件。此部分的完整代碼請(qǐng)參考Example3.js。效果如圖8和圖9所示。

TwinTrigger 之下拉列表 
圖8. TwinTrigger 之下拉列表

載入員工信息 
圖9. 載入員工信息

  1. 清單7.定義新類ComboSearchField  
  2.       
  3. Ext.ns('Ext.ux.form');  
  4.  
  5. ExtExt.ux.form.ComboSearchField=Ext.extend(Ext.form.ComboBox,{  
  6. initComponent:function(){  
  7. Ext.ux.form.ComboSearchField.superclass.initComponent.call(this);  
  8. this.triggerConfig={  
  9. //使用TwinTrigger的樣式  
  10. tag:'span',cls:'x-form-twin-triggers',cn:[  
  11. {tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger"+  
  12. this.triggerClass},//使用默認(rèn)ComboBox的樣式  
  13. {tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger"+  
  14. this.trigger2Class}//自定義Trigger2的樣式  
  15. ]};  
  16. },  
  17. getTrigger:function(index){  
  18. returnthis.triggers[index];  
  19. },  
  20. initTrigger:function(){  
  21. varts=this.trigger.select('.x-form-trigger',true);  
  22. this.wrap.setStyle('overflow','hidden');  
  23. vartriggerField=this;  
  24. ts.each(function(t,all,index){  
  25. t.hide=function(){  
  26. varw=triggerField.wrap.getWidth();  
  27. this.dom.style.display='none';  
  28. triggerField.el.setWidth(w-triggerField.trigger.getWidth());  
  29. };  
  30. t.show=function(){  
  31. varw=triggerField.wrap.getWidth();  
  32. this.dom.style.display='';  
  33. triggerField.el.setWidth(w-triggerField.trigger.getWidth());  
  34. };  
  35. vartriggerIndex='Trigger'+(index+1);  
  36.  
  37. if(this['hide'+triggerIndex]){  
  38. t.dom.style.display='none';  
  39. }  
  40. //this.mon(t,'click',this['on'+triggerIndex+'Click'],this,  
  41. {preventDefault:true});  
  42. //定義***個(gè)trigger的觸發(fā)事件  
  43. if(index==0)  
  44. t.on("click",this['onTriggerClick'],this,{preventDefault:true});  
  45. //定義第二個(gè)trigger的觸發(fā)事件  
  46. if(index==1)  
  47. t.on("click",this['onTrigger2Click'],this,{preventDefault:true});  
  48. t.addClassOnOver('x-form-trigger-over');  
  49. t.addClassOnClick('x-form-trigger-click');  
  50. },this);  
  51. this.triggers=ts.elements;  
  52. },  
  53.  
  54. validationEvent:false,  
  55. validateOnBlur:false,  
  56. trigger2Class:'x-form-search-trigger',  
  57. width:180,  
  58. hasSearch:false,  
  59. paramName:'query',  
  60. onTrigger2Click:Ext.emptyFn  
  61. }); 

 

  1. 清單8.教職工信息查詢控件  
  2.       
  3. Ext.onReady(function(){  
  4. varemployeeData=[  
  5. ['20001234'],  
  6. //省略部分代碼  
  7. ['20091546']  
  8. ];  
  9. varsearchField=newExt.ux.form.ComboSearchField({  
  10. id:"employeeId",  
  11. fieldLabel:'員工編碼'+'<fontcolorfontcolor="red">*</font>',  
  12. store:newExt.data.SimpleStore({  
  13. fields:['value'],  
  14. data:employeeData  
  15. }),  
  16. valueField:'value',  
  17. displayField:'value',  
  18. typeAhead:false,  
  19. allowBlank:false,  
  20. mode:'local',  
  21. triggerAction:'all',  
  22. //打開客戶查詢窗口,代碼從略  
  23. onTrigger2Click:_searchCustomer.createDelegate(this),  
  24. listeners:{  
  25. //根據(jù)選中客戶編碼加載客戶信息,代碼從略  
  26. select:_select_customer_id.createDelegate(this)  
  27. }  
  28. });  
  29.  
  30. //以下代碼僅在Firefox中運(yùn)行有效  
  31. //初始化生成表格  
  32. varemployeeForm=newExt.FormPanel({  
  33. id:"employeeForm",  
  34. frame:true,  
  35. title:"教職工信息查詢",  
  36. autoScroll:true,  
  37. items:[{  
  38. layout:'column',  
  39. border:false,  
  40. autoHeight:true,  
  41. defaults:{  
  42. layout:'form',  
  43. border:false,  
  44. width:100,  
  45. bodyStyle:'padding:4px'  
  46. },  
  47. items:[{  
  48. columnWidth:0.33,  
  49. name:"form1",  
  50. id:"form1",  
  51. defaultType:'textfield',  
  52. defaults:{  
  53. width:200  
  54. },  
  55. items:[searchField,  
  56. {  
  57. fieldLabel:'職稱',  
  58. name:'title',  
  59. id:'title',  
  60. disabled:true  
  61. },{  
  62. fieldLabel:'出生日期',  
  63. name:'birthday',  
  64. id:'birthday',  
  65. disabled:true  
  66. },{  
  67. fieldLabel:'聯(lián)系電話',  
  68. name:'tel',  
  69. id:'tel',  
  70. disabled:true  
  71. }]},{  
  72. columnWidth:0.33,  
  73. //從略  
  74. },{  
  75. columnWidth:0.33,  
  76. //從略  
  77. }]  
  78. }],  
  79. renderTo:'example3'  
  80. });  
  81. }); 

總結(jié)

本文在介紹了Ext的基本概念以及擴(kuò)展Ext的一般方法后,以三個(gè)應(yīng)用場(chǎng)景為例,詳細(xì)描述了如何從已有的Ext控件出發(fā),借鑒其他控件的功能,開發(fā)出滿足實(shí)際需要的新控件。對(duì)于初學(xué)者來(lái)說(shuō),這種“移花接木”式的開發(fā)方式,不僅能使開發(fā)者深入了解每個(gè)控件背后的實(shí)現(xiàn)方式,而且能迅速助其實(shí)現(xiàn)新的功能、新的需求??梢哉f(shuō),它是一種值得推薦的創(chuàng)新方式。

【編輯推薦】

  1. ExtJS Grid Tooltip的3+1種實(shí)現(xiàn)方式總結(jié)
  2. ExtJS在Android模擬器上的運(yùn)行效果
  3. WCF與ExtJs實(shí)現(xiàn)項(xiàng)目分析 
責(zé)任編輯:王曉東 來(lái)源: IBM
相關(guān)推薦

2017-08-04 18:10:09

2019-09-18 09:06:40

MySQLRedis協(xié)議

2013-11-12 09:52:38

2010-06-17 09:18:57

Ext JSSencha

2012-10-18 10:15:50

IBMdw

2011-04-01 09:04:09

RIP

2011-05-23 13:24:01

2019-12-27 15:05:51

Python類方法裝飾器

2009-11-23 17:31:49

PHP時(shí)間戳

2009-11-23 20:16:17

PHP接口特性

2011-04-07 13:09:03

明文驗(yàn)證

2013-01-10 14:54:48

Android開發(fā)組件Intent

2010-06-03 18:22:38

Hadoop

2010-09-14 17:20:57

2011-04-02 16:37:26

PAT

2018-07-20 09:12:00

人工智能機(jī)器學(xué)習(xí)虛假視頻

2009-11-23 15:32:13

PHP獲取遠(yuǎn)程URL

2010-04-20 16:34:31

2009-11-23 14:44:22

PHP 5.0構(gòu)造函數(shù)

2009-10-20 10:16:24

VB.NET COMB
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)