Ext 2.0中取消了组件的构造方法,你完全可以在initComponent中执行自己的构造逻辑。假如开发过 Asp.Net的控件,那么你应该比较熟悉这种开发模式。只要你了解Ext控件的各个方法的生命周期,调用模式,那么你可以随心所欲的继承和扩展Ext的组件,和开发自己的新的组件。 比如我们需要一个显示用户信息的Grid,那么在Ext 2.0中可以更加方便的实现。 以下代码是显示用户信息的GridPanel:
1 /**//** 2 * @author Terry 3 */ 4 5 EasyNet.UserGrid = Ext.extend(Ext.grid.GridPanel, { 6 serviceURL: '', 7 loadMask: { 8 msg: '加载用户信息 ' 9 }, 10 viewConfig: { 11 forceFit: true 12 }, 13 14 initComponent: function() { 15 var url = this.serviceURL; 16 17 this.store = new Ext.data.Store( { 18 proxy: new Ext.data.HttpProxy( { 19 url: url + '/QueryUser' 20 }), 21 baseParams: { 22 fields: '*', 23 filter: 'Status=1' 24 }, 25 reader: new Ext.data.XmlReaderEx( { 26 root: 'User', 27 totalRecords: 'Count', 28 record: 'UserData', 29 id: 'ID' 30 }, [ 31 {name: 'LoginName', mapping: 'LoginName'}, 32 {name: 'UserName', mapping: 'UserName'}, 33 {name: 'Sex', type: 'int', mapping: 'Sex'}, 34 {name: 'RegDate', type: 'date', format: 'Y-m-d', mapping: 'RegDate'} 35 ]) 36 }); 37 38 this.cm = new Ext.grid.ColumnModel([ { 39 header: '登录名称', 40 dataIndex: 'LoginName' 41 }, { 42 header: '用户名称', 43 dataIndex: 'UserName' 44 }, { 45 header: '用户姓名', 46 dataIndex: 'UserName' 47 }, { 48 header: '性别', 49 dataIndex: 'Sex', 50 renderer: function(v, params, data) { 51 if(v == 1) { 52 return '男'; 53 } 54 55 return '女'; 56 } 57 }, { 58 header: '注册时间', 59 dataIndex: 'RegDate' 60 }]); 61 62 this.cm.defaultSortable = true; 63 64 var searchBtn = new Ext.Button( { 65 text: '查找' 66 }); 67 var delBtn = new Ext.Button( { 68 text: '删除' 69 }); 70 71 searchBtn.on('click', this.onSearch, this); 72 delBtn.on('click', this.onDelete, this); 73 74 this.tbar = [searchBtn, delBtn]; 75 76 var store = this.store; 77 78 this.bbar = new Ext.PagingToolbarEx( { 79 store: store, 80 displayMsg: '显示用户信息 {0} - {1} / {2}', 81 emptyMsg: '没有用户信息', 82 paramNames: { 83 start: 'pageIndex', 84 limit: 'pageSize' 85 } 86 }); 87 88 EasyNet.UserGrid.superclass.initComponent.call(this); 89 }, 90 91 loadData: function() { 92 var params = Ext.util.JSON.decode(Ext.util.JSON.encode(this.store.baseParams)); 93 params.pageIndex = 1; 94 params.pageSize = 20; 95 this.store.load( {params: params}); 96 }, 97 98 onSearch: function() { 99 if(!this.searchWindow) { 100 this.searchWindow = new EasyNet.SearchUserWindow( { 101 searchTo:this 102 }); 103 } 104 105 this.searchWindow.show(); 106 }, 107 108 onDelete: function() { 109 var sls = this.getSelections(); 110 var count = sls.length; 111 112 if(count == 0) { 113 return; 114 } 115 116 var surl = this.serviceURL; 117 var grid = this; 118 119 Ext.Msg.show( { 120 title: '确认删除用户', 121 msg: '确实要删除所选用户吗?', 122 buttons: Ext.Msg.YESNO, 123 icon: Ext.Msg.WARNING, 124 fn: function(btn, text) { 125 if(btn == 'yes') { 126 var filter = ''; 127 128 for(var i = 0; i < count; i ++) { 129 if(i == 0) { 130 filter = new String(sls[0].id); 131 } 132 else { 133 filter = filter + ',' + sls[i].id; 134 } 135 } 136 137 var store = new Ext.data.Store( { 138 proxy: new Ext.data.HttpProxy( { 139 url: surl + '/DeleteUser' 140 }) 141 }); 142 143 store.load( {params: {filter: 'ID IN(' + filter +')'}}); 144 grid.loadData(); 145 } 146 } 147 }); 148 } 149 }); 150 151 Ext.reg('easynetusergrid', EasyNet.UserGrid);
以下是查找用户对话窗体:
1 /**//** 2 * @author Terry 3 */ 4 5 EasyNet.SearchUserWindow = Ext.extend(Ext.Window, { 6 width: 350, 7 height: 250, 8 resizable: false, 9 layout: 'form', 10 plain: true, 11 bodyStyle: 'padding:5px;', 12 buttonAlign: 'right', 13 modal:true, 14 title: '查找用户', 15 closeAction: 'hide', 16 buttons: [ { 17 text: '确定' 18 }, { 19 text: '取消' 20 }], 21 22 initComponent: function() { 23 this.items = [ { 24 layout: 'column', 25 baseCls: 'x-plain', 26 items: [ { 27 columnWidth:0.08, 28 layout: 'form', 29 baseCls: 'x-plain', 30 items: [ { 31 hideLabel: true, 32 xtype: 'checkbox', 33 name: 'ckLoginName' 34 }, { 35 hideLabel: true, 36 xtype: 'checkbox', 37 name: 'ckUserName' 38 }, { 39 hideLabel: true, 40 xtype: 'checkbox', 41 name: 'ckDate' 42 }] 43 }, { 44 columnWidth: 0.8, 45 layout: 'form', 46 baseCls: 'x-plain', 47 items: [ { 48 xtype: 'textfield', 49 fieldLabel: '登录名称', 50 emptyText: '登录名称', 51 maxLength: 50, 52 name: 'loginName' 53 }, { 54 xtype: 'textfield', 55 fieldLabel: '用户名称', 56 emptyText: '用户名称', 57 maxLength: 50, 58 name: 'userName' 59 }, { 60 xtype: 'datefield', 61 fieldLabel: '起始时间', 62 emptyText: '年-月-日', 63 format: 'Y-m-d', 64 width: 130, 65 name: 'bDate' 66 }, { 67 xtype: 'datefield', 68 fieldLabel: '起始时间', 69 emptyText: '年-月-日', 70 format: 'Y-m-d', 71 width: 130, 72 name: 'eDate' 73 }] 74 }] 75 }]; 76 77 Easy.SearchUserWindow.superclass.initComponent.call(this); 78 }, 79 80 onRender: function(ct, position) { 81 EasyNet.SearchUserWindow.superclass.onRender.call(this, ct, position); 82 this.buttons[0].on('click', this.onSearch, this); 83 this.buttons[1].on('click', this.onCancel, this); 84 85 }, 86 87 onSearch: function() { 88 this.loadData(); 89 }, 90 91 onCancel: function() { 92 if(this.closeAction == 'hide') { 93 this.hide(); 94 } 95 else if(this.closeAction == 'close') { 96 this.close(); 97 } 98 }, 99 100 getValue: function() { 101 return { 102 ckLoginName: this.find('name', 'ckLoginName')[0].getValue(), 103 ckUserName: this.find('name', 'ckUserName')[0].getValue(), 104 loginName: this.find('name', 'loginName')[0].getValue(), 105 userName: this.find('name', 'userName')[0].getValue(), 106 bDate: this.find('name', 'bDate')[0].getValue(), 107 eDate: this.find('name', 'eDate')[0].getValue() 108 } 109 }, 110 111 getCondition: function() { 112 var o = this.getValue(); 113 var filter ='Status=1'; 114 115 if(o.ckLoginName && o.LoginName != '') { 116 filter += String.format(' AND LoginName LIKE \'% {0}%\'', o.loginName); 117 } 118 if(o.ckUserName && o.userName != '') { 119 filter += String.format(' AND UserName LIKE \'% {0}%\'', o.userName); 120 } 121 if(o.ckDate && o.bDate != '' && o.eDate != '' && o.eDate >= o.bDate) { 122 filter += String.format(' AND RegDate BETWEEN \' {0}\' AND \' {1}\'', o.bDate, o.eDate); 123 } 124 125 return { 126 fields: '*', 127 filter: filter 128 } 129 }, 130 131 loadData: function() { 132 if(this.searchTo) { 133 this.searchTo.store.baseParams = this.getCondition(); 134 this.searchTo.loadData(); 135 } 136 137 this.onCancel(); 138 } 139 });
在实际应用中所有数据调用.Net写的Web Service取得。
|