在ExtJs开发中,做一个控件,他有一个主界面的panel类(其他开发人员可见),这个主界面由定义好的其他类(这些类其他开发人员不用关心)组成,那么其他类上的一些表格单击事件、button单击事件,就需要由最外层控件监听,此时可以把内部控件的事件,传递到外层panel类来监听。
这个类是暴露给其他人的主界面类BillLayout.js
Ext.define('shinow.drug.common.layout.BillLayout', {
extend : 'Ext.panel.Panel',
requires : ['drug.common.layout.BillContainer'],
alias : 'widget.BillLayout',
border : false,
layout : 'fit',
billTitle : '',// 单据标题
billTop : {},// 单据上半部分
billCenter : {},// 单据表内容
billBottom : {},// 单据下半部分
tbButtons : [],// 工具栏中按钮集合
seniorConditions : null,//查询 高级条件
url : null,//单据列表所对应的URL 例子:contentPath + '/xx/xx.action?'+ Ext.Object.toQueryString({'param1' : param1,'param2' : param2})
initComponent : function() {
var me = this;
if (me.tbButtons.length <= 0) {
alert('没有工具栏,请设置!')
me.callParent(arguments);
}
Ext.applyIf(me, {
dockedItems : [{
xtype : 'toolbar',
dock : 'top',
items : me.tbButtons
}],
items : [
{
xtype : 'BillContainer',
region : 'center',
billTitle : me.billTitle,
billTop : me.billTop,
billCenter : me.billCenter,
billBottom : me.billBottom,
seniorConditions : me.seniorConditions,
url : me.url
}
]
});
me.addEvents({
'billQueryGridClick' : true ,//查询列表单击事件
'billQueryBtnClick' : true//查询单据按钮单击事件
});
me.callParent(arguments);
var billContainer = me.down('BillContainer[region="center"]');
billContainer.addListener('billQueryGridClick',
function(grid, record, item, index, e, eOpts){
me.fireEvent('billQueryGridClick',grid, record, item, index, e, eOpts);
});
billContainer.addListener('billQueryBtnClick',function(btn){
me.fireEvent('billQueryBtnClick',btn);
});
}
});
下边几个类是他的组成元素
BillContainer.js
Ext.define('shinow.drug.common.layout.BillContainer', {
extend : 'Ext.container.Container',
border : true,
margin : 3,
requires : ['drug.common.layout.BillQuery',
'drug.common.layout.BillPart', 'shinow.ux.search.Field'],
layout : 'border',
alias : 'widget.BillContainer',
billTitle : '',// 单据标题
billTop : {},// 单据上半部分
billCenter : {},// 单据表内容
billBottom : {},// 单据下半部分
seniorConditions : null,//查询条件高级部分
url : null,
initComponent : function() {
var me = this;
Ext.applyIf(me, {
items : [{
xtype : 'BillQuery',
region : 'west',
collapsible : true,
header : false,
split : true,
collapsible : true,
hideCollapseTool : true,
seniorConditions :me.seniorConditions,
url : me.url
}, {
xtype : 'BillPart',
region : 'center',
billTitle : me.billTitle,
billTop : me.billTop,
billCenter : me.billCenter,
billBottom : me.billBottom
}]
});
me.addEvents({
'billQueryGridClick' : true,
'billQueryBtnClick' : true
});
me.callParent(arguments);
var billQuery = me.down('BillQuery[xtype="BillQuery"]');
billQuery.addListener('billQueryGridClick',function(grid, record, item, index, e, eOpts){
me.fireEvent('billQueryGridClick',grid, record, item, index, e, eOpts);
});
billQuery.addListener('billQueryBtnClick',function(btn){
me.fireEvent('billQueryBtnClick',btn);
});
}
});
BillQuery.js
Ext.define('shinow.drug.common.layout.BillQuery', {
extend : 'Ext.panel.Panel',
border : true,
requires : ['drug.common.layout.BillList'],
layout : 'border',
width : 200,
alias : 'widget.BillQuery',
seniorConditions : null,
url : null,
initComponent : function() {
var me = this;
Ext.applyIf(me, {
items : [{
xtype : 'panel',
region : 'north',
border : false,
layout : 'vbox',
defaults : {
width : 200,
border : false
},
items : [{
xtype : 'panel',
panelMark : 'kufangPanel',
height : 80,
layout : {
type : 'table',
columns : 1
},
bodyStyle : {
background : '#ffc',
padding : '10px 2px 0px 2px'
},
items : [{
xtype : 'label',
text : '业务部门'
}, {
xtype : 'combo',
name :'kf',
comboMark : 'kufangCombo',
labelAlign : 'right',
labelWidth : 30,
style : {
margin : "15px 0px 0px 0px"
},
width : 180,
fieldLabel : '库房'
}]
}, {
xtype : 'panel',
panelMark : 'danjusoubu',
height : 65,
cls : 'x-b-t',
layout : 'vbox',
bodyStyle : {
padding : '10px 2px 0px 2px'
},
items : [{
xtype : 'label',
text : '单据搜捕'
}, {
xtype : 'search',
width : 190,
style : {
margin : "10px 0px 0px 0px"
}
,
seniorConditions : me.seniorConditions
}]
}]
}, {
xtype : 'BillList',
region : 'center',
url : me.url
}]
});
me.addEvents({
'billQueryGridClick' : true ,
'billQueryBtnClick' : true
});
me.callParent(arguments);
var billList = me.down('BillList[xtype="BillList"]');
billList.addListener('itemclick',function(grid, record, item, index, e, eOpts ){
me.fireEvent('billQueryGridClick', grid, record, item, index, e, eOpts);
});
var queryBtn = me.down('panel[region="north"]').down('panel[panelMark="danjusoubu"]').down('search[xtype="search"]').down('button[action="queryBtn"]');
queryBtn.addListener('click',function(btn){
me.fireEvent('billQueryBtnClick', btn);
me.queryGrid(billList, queryBtn);
});
}
,
queryGrid : function(billList,queryBtn){
var me = this;
var billListStore = billList.getStore();
var kf = me.down('panel[region="north"]').down('panel[panelMark="kufangPanel"]').down('combo[comboMark="kufangCombo"]');
var queryParam = queryBtn.up('search[xtype="search"]').down('textfield[name="queryParam"]');
if(billListStore.proxy.url){
billListStore.proxy.extraParams = {'kf' : kf.getValue(), 'queryParam' : queryParam.getValue()};
billListStore.reload();
}else{
Ext.Msg.alert('警告','单据列表没有配置URL!');
}
}
});
Field.js
Ext.define('shinow.ux.search.Field', {
extend : 'Ext.form.FieldContainer',
alias : ['widget.searchfield', 'widget.search'],
requires : ['shinow.ux.search.Window'],
border : true,
seniorConditions : null,
initComponent : function() {
var me = this;
Ext.applyIf(me, {
layout : {
type : 'hbox',
align : 'middle'
},
cls : 'x-form-field x-panel-body-default',
height : 25,
items : [{
xtype : 'textfield',
border : 0,
height:25,
fieldStyle : {
border : 'none'
},
fieldCls : 'x-field-null',
flex : 1,
name : 'queryParam'
}, {
xtype : 'button',
action : 'queryBtn',
width : 40,
margin:'0 2 0 0',
text : '查询'
}, {
xtype : 'button',
width : 40,
text : '高级',
handler : function() {
var queryWin = Ext.create(
'shinow.ux.search.Window', {
seniorConditions : me.seniorConditions
});
queryWin.show();
}
}]
})
me.callParent();
}
});
现在的情况是:BillLayout类由BillContainer、BillQuery、Field三个类嵌套组成。我们的查询按钮在Field类里,如果不用事件传递,那么想在controller里监听到button的click事件,那么我们就得用选择器一层一层找到button这个对象,然后再监听事件。而我们只想给外边提供BillLayout类,此时就需要把button的click事件的监听,交给BillLayout。先来看下简单的界面。
首先我们需要在BillQuery类里注册一个监听事件
me.addEvents({//给自己的类注册自定义监听事件
'billQueryGridClick' : true ,
'billQueryBtnClick' : true
});
然后再拿到查询按钮对象,给按钮对象注册一个click的监听事件,每当button的click执行时,就触发BillQuery类的billQueryBtnClick这个事件:
var queryBtn = me.down('panel[region="north"]').down('panel[panelMark="danjusoubu"]').down('search[xtype="search"]').down('button[action="queryBtn"]');//通过选择器获得查询按钮对象
queryBtn.addListener('click',function(btn){//给查询按钮注册click监听事件
me.fireEvent('billQueryBtnClick', btn);//当button的click事件触发时就执行次行代码(触发BillQuery类的billQueryBtnClick监听事件。)
me.queryGrid(billList, queryBtn);
});
以此类推,就可以把button的click监听事件,传递给BillLayout类。
------------------------此贴是工作记录帖,本人组织语言欠佳,看不懂的不要骂------------------------