龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

移花接木 实例讲解Ext JS控件的扩展(1)(5)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
实现带ComboBox的TwinTriggerField 在上述的教职工科研基金管理系统中,需要一个查询员工详细信息的控件。只要输入员工号或者从下拉列表中选择一个员工号

实现带ComboBox的TwinTriggerField

在上述的教职工科研基金管理系统中,需要一个查询员工详细信息的控件。只要输入员工号或者从下拉列表中选择一个员工号,就能自动载入该员工所有的信息。同时希望能根据搜索条件查询符合条件的员工,从中选择某个员工,查看他的详细信息。

依据这个需求,我们要构建一个查询员工的组件,当在文本框中输入员工号前几位能自动列出所有相关员工号,或者直接从下拉框中选择一个员工号,随后自动载入员工信息;当点击文本框右边的搜索按钮,打开新的窗口,在新窗口中能够根据员工职位、院系、出生日期所在范围等进行搜索,选中员工之后,也会自动载入该员工的信息。如果能将ComboBox和TwinTriggerField的功能结合起来,将是实现此需求的最直接、最便利的方法。

清单7是我们为满足上述需求而扩展的新类ComboSearchField的部分代码,清单8是使用ComboSearchField构造了一个Form作为教职工信息查询控件。此部分的完整代码请参考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},//使用默认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. //定义第一个trigger的触发事件  
  43. if(index==0)  
  44. t.on("click",this['onTriggerClick'],this,{preventDefault:true});  
  45. //定义第二个trigger的触发事件  
  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. //根据选中客户编码加载客户信息,代码从略  
  26. select:_select_customer_id.createDelegate(this)  
  27. }  
  28. });  
  29.  
  30. //以下代码仅在Firefox中运行有效  
  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:'联系电话',  
  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. }); 

总结

本文在介绍了Ext的基本概念以及扩展Ext的一般方法后,以三个应用场景为例,详细描述了如何从已有的Ext控件出发,借鉴其他控件的功能,开发出满足实际需要的新控件。对于初学者来说,这种“移花接木”式的开发方式,不仅能使开发者深入了解每个控件背后的实现方式,而且能迅速助其实现新的功能、新的需求。可以说,它是一种值得推荐的创新方式。

精彩图集

赞助商链接