折腾了一个晚上,终于粗略实现这个功能。
1、原理很简单,就是单独创建N个表格或表单,当然还要有相应配套的store,然后每次点击菜单创建一个新对象加载到公共窗口。这里说的公共窗口其实也不准确,其实是一种假共用窗口;因为弹出的时候还是要先赋给一个新建的,唯一的对象,否则窗口还是会冲突。不过这样也少敲了不少代码。
2、深化两个问题,下一步计划:
A、怎样在创建的时候生成窗口类,就好像面向对象里面的类和对象关系,定义一个公共窗口类,然后在弹出公共窗口的地方创建新对象就ok了;
B、怎么样能连窗口里的子项比如grid或Form甚至store都能抽象出来,就好比定义一个类的外壳,在需要的地方load数据就搞掂。目前看来有点难,因为比如表格里面的列是每个窗口都有可能不一样的,有没有像泛型这样的类,或者是能动态添加列的模板。不过这两个问题先放这里。
3、实现步骤:
1st、创建数据:包括data、store
2nd、创建内容:grid或者form,这里我选择grid
3rd、创建窗口的壳:这里用了一个addWin()函数返回一个对象,相当于定义一个类,在需要的地方用这个函数返回一个新窗口赋给具体的对象。这里说明一哈,window的close方法会自动清理win中组件,比如grid、form、toolbar等,不用自己处理(这个是今晚耗时的主要原因,一开始走错路了,百般纠结....)。
4th、主函数里面创建菜单,调用PopWin()方法,大功告成!效果图如下:
A、主菜单,有点寒酸哦,
B、第一个窗口
C、第二个窗口
下面是js码,纯手工敲打,勿拍砖,希冀抛砖引玉:
//本地数据 var data1 = [["产品类型001", "产品类型一", "产品大类1"], ["产品类型002", "产品类型二", "产品大类2"], ["产品类型003", "产品类型三", "产品大类3"]]; var data2 = [["客户类型001", "客户类型一"], ["客户类型002", "客户类型二"]]; //产品类别表store var JCZL_CPLBBH = new Ext.data.SimpleStore({ data:data1, fields:["LBBH","LBMC","CPDL"] }); JCZL_CPLBBH.load(); //客户类别表store var JCZL_KHLBBH = new Ext.data.SimpleStore({ data: data2, fields: ["LBBH", "LBMC"] }); JCZL_KHLBBH.load(); //产品类别表grid var JCZL_CPLBBHGrid = Ext.create('Ext.grid.Panel', { //el: "JCZL_CPZLB_MGrid", width: 450, height: 550, border: false, frame: true, selType: "rowmodel", store: JCZL_CPLBBH, viewConfig: { columnsText: "显示/隐藏列", sortAscText: "正序排列", sortDescText: "倒序排列", forceFit: true }, columns: [ new Ext.grid.RowNumberer({ text: "序号", width: 50 }), { header: "类别编号", dataIndex: "LBBH", sortable: true, width: 80 }, { header: "类别名称", dataIndex: "LBMC", sortable: true, width: 100 }, { header: "产品大类", dataIndex: "CPDL", editor: 'textfield', sortable: true, width: 120 } ], plugins: [ Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1 }) ], loadMask: true, listeners: { } }); //客户类别表grid var JCZL_KHLBBHGrid = Ext.create('Ext.grid.Panel', { //el: "JCZL_CPZLB_MGrid", width: 450, height: 550, border: false, frame: true, selType: "rowmodel", store: JCZL_KHLBBH, viewConfig: { columnsText: "显示/隐藏列", sortAscText: "正序排列", sortDescText: "倒序排列", forceFit: true }, columns: [ new Ext.grid.RowNumberer({ text: "序号", width: 50 }), { header: "类别编号", dataIndex: "LBBH", sortable: true, width: 100 }, { header: "类别名称", dataIndex: "LBMC", sortable: true, width: 100 } ], plugins: [ Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1 }) ], loadMask: true, listeners: { } }); //生成新窗口方法,返回一个window对象 function addWin(text) { var CommonWin = Ext.create('Ext.window.Window', { width: 450, height: 550, region: "west", plain: true, layout: "fit", closeAction: "hide", modal: true, listeners: { hide: function (win, eOpts) { //关闭动作自动清除item,也可单独写到工具条外面 win.close(); } } }); return CommonWin; } //弹出窗口方法 function PopWin(btn) { if (btn.text == "第一个窗口") { var first = addWin(btn.text);//定义个窗口防止冲突 first.add(JCZL_CPLBBHGrid); first.show(); } else { var second = addWin(btn.text); second.add(JCZL_KHLBBHGrid); second.show(); } } //Ext入口 Ext.onReady(function () { //生成新菜单 var menu = Ext.create('Ext.toolbar.Toolbar', { renderTo: 'menu', width: 200, height: 30, items: [ { text: "第一个窗口", handler: PopWin }, { text: "第二个窗口", handler: PopWin } ] }); });