Extjs重写Ext.Panel遇到的问题,各位老大帮忙!困惑我好长时间了,谢谢了 jhwcd 王东 等级: 发表于:2008-08-01 20:12:511楼 得分:0 好的,我先看看。 //-----------------------------------------谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我把问题简单描述下:Ext.extend(AA,Ext.grid.EditGridPanel,{....});//定义AA从Ext.grid.EditGridPanel继承Ext.extend(BB,AA,{....});//定义BB从AA继承Ext.extend(CC,BB,{....});//定义CC从BB继承var cc=new CC();//实例化一个CC对象名称为cc//下面两段代码是创建一个Ext.Window对象win,把cc最为win的itemsvar win=new Ext.Window({ width:438, height:315, buttonAlign:"center", title:'查询', modal:true, closeAction:"hide", items:[cc], buttons:[{text:"关闭",handler:function(){win.close();},scope:this}] });win.show();此时如图:点击"关闭按钮",然后在不刷新的情况下点击“open”如图 EditGridPanel“点击某个单元格变为输入框”的实现原理是:给每列创建一个隐藏的可编辑div,当单击某个单元格时把这个div显示在Cell上面。通过调试,怀疑问题出在:点击关闭时,这个可编辑的div丢失了,而再次打开窗口时又没有创建这个可编辑的div,所以出错。//----------------------------------------------------小弟愚钝,已经搞一周了,毫无进展,望各位老大帮忙,谢谢 源代码下载后可直接运行下载地址:http://files.cnblogs.com/kuailewangzi1212/源代码解压开可执行cs。htm.rar 我在FF3.0,IE6.0里没有出现错误,只是关闭后,再打开,原来编辑过的列,都不能再编辑了!你的代码是:AA继承Ext.Panel 方法creategrid返回一个GridPanelBB继承AA,并重载方法creategrid,返回一个EditGridPanelCC继承BB 我在FF3.0,IE6.0里没有出现错误, 只是关闭后,再打开,原来编辑过的列,都不能再编辑了! 你的代码是: AA继承Ext.Panel 方法creategrid返回一个GridPanel BB继承AA,并重载方法creategrid,返回一个EditGridPanel CC继承BB //---------------------------------对 有些地方太累赘去掉了//基类//------------------------------------------------------------------------------------------AA=Ext.extend(Ext.Panel,{ layout:"fit", createstore:function() { return new Ext.data.SimpleStore( { data:[ ['1','mxh','aa','20080101','1','bb','bb'], ['2','mxh','aa','20080101','1','bb','bb'], ['3','mxh','aa','20080101','1','bb','bb'], ['4','mxh','aa','20080101','1','bb','bb'], ['5','mxh','aa','20080101','1','bb','bb'], ['6','mxh','aa','20080101','1','bb','bb'], ['7','zmm','aa','20080101','1','aa','aa'] ], fields:this.storeMapping } ); }, creategrid:function() { return new Ext.grid.EditorGridPanel({ store: this.store, cm: this.cm,// clicksToEdit:1 }); }, initComponent : function() { //初始化列表 this.store=this.createstore();//创建数据源 AA.superclass.initComponent.call(this); this.grid=this.creategrid(); this.add(this.grid);//添加grid //this.store.load(); }});//---------------------------------------------------------------------------------------------------------------------------CC=Ext.extend(AA,{ title:'标题', width:400, height:250, storeMapping:[ {name:"Id",mapping:'id',type:'int'}, {name:"Name"}, {name:"Password"}, {name:"LastLoginTime"}, {name:"LoginTimes"}, {name:"Email"}, {name:"Re"} ], cm:new Ext.grid.ColumnModel( [ {header: "用户名", sortable:true,width: 100, dataIndex:"Name",editor:new Ext.form.TextField()}, {header: "密码", sortable:true,width: 100, dataIndex:"Password",editor:new Ext.form.TextField()}, {header: "电子邮箱", sortable:true,width: 100, dataIndex:"Email",editor:new Ext.form.TextField()}, {header: "上次登录时间", sortable:true,width: 100, dataIndex:"LastLoginTime",editor:new Ext.form.TextField()}, {header: "登录次数", sortable:true,width: 100, dataIndex:"LoginTimes",editor:new Ext.form.TextField()}, {header: "备注", sortable:true,width: 100, dataIndex:"Re",editor:new Ext.form.TextField()} ]) });//----------------------------------------------------测试window.onload=function(){ Ext.get('btn_open').on('click',function(){ if(win) win.show(); else open_panel(); });}var panel,win;open_panel=function(){ panel=new CC(); win=new Ext.Window({ width:600, height:400, buttonAlign:"center", title:'查询', modal:true, //shadow:true, closeAction:"hide", items:[panel], buttons:[ {text:"关闭",handler:function(){win.hide();},scope:this}] }); win.show();} 因为Extjs的继承机制Ext.extend=function(this,o){ for(var i in o) { this[i]=o[i]; }}他只能实现简单的属性继承,存在很多问题,比如内存释放问题,建议用这种继承方式AA=function(){ this.creategrid=function() { }; ...};BB=function(){ ...};BB.prototype=new AA();CC=function(){};cc.prototype=new BB();//楼上这位兄弟的方法只是把panel和编辑框隐藏起来,并没有真正释放掉内存,如果是单个窗口时没问题,但是遇到复杂的界面就会出现很多问题 问题解决了,贴出来,希望对大家有用,再次感谢各位的帮忙----------------------------------------------------//基类//------------------------------------------------------------------------------------------AA=function(){ this.createstore=function(){ return new Ext.data.SimpleStore( { data:[['0','mxh','0'],['1','zmm','1'],['2','nn','1']], fields:this.storeMapping } );}; this.storeMapping=[{name:'id'},{name:'name'},{name:'sex'}]; this.cm=new Ext.grid.ColumnModel( [ {header:'编号',dataIndex:'id',sortable:false,editor:new Ext.form.TextField()},//不可排序 {header:'姓名',dataIndex:'name',sortable:true,editor:new Ext.form.TextField()},//可排序 {header:'性别',dataIndex:'sex',sortable:true,editor:new Ext.form.TextField()}// ] ); this.creategrid=function()// { return new Ext.grid.EditorGridPanel({ store: createstore(), cm: this.cm, layout:'fit', width:300, height:200, title:'cs', mode:false, autoExpandColumn:2,//指定地第二列为自动拉伸列 clicksToEdit:1,//单击一次变为可编辑,默认为二次 loadMask:{Msg:'这个在加载数据...'} }) }; };//类BBBB=function(){ this.createstore=function(){return new Ext.data.SimpleStore( { data:[['0','mxh','0'],['1','zmm','1']], fields:this.storeMapping } );}; this.storeMapping=[{name:'id'},{name:'name'},{name:'sex'}]; this.cm=new Ext.grid.ColumnModel( [ {header:'编号',dataIndex:'id',sortable:false,editor:new Ext.form.TextField()},//不可排序 {header:'姓名',dataIndex:'name',sortable:true,editor:new Ext.form.TextField()},//可排序 {header:'性别',dataIndex:'sex',sortable:true,editor:new Ext.form.TextField()}// ] );};BB.prototype=new AA();//类CCCC=function(){ this.createstore=function(){return new Ext.data.SimpleStore( { data:[['0','mxh','0']], fields:this.storeMapping } );};};CC.prototype=new BB();//----------------------------------------------------测试window.onload=function(){ Ext.get('btn_open').on('click',function(){open_panel();});//btn_getdiv}open_panel=function(){ var bb=new BB(); var gridbb=bb.creategrid(); var win = new Ext.Window({ width:600, height:400, buttonAlign:"center", title:'查询', modal:false, shadow:true, autoDestroy:true, closeAction:"close", items:[gridbb], buttons:[ {text:"关闭",handler:function(){win.close();Ext.destroy(bb);},scope:this}] }); win.show();} 内存泄漏时整个ext体系的问题,很难通过简单的处理解决。不过还是很赞成13楼的做法,我也一直那样用。这好像是回复的第七个关于ext的帖子了,每次都是无满意结贴,以后不回答ext的帖子了,费力不少,还什么也捞不着 求一个可滚动的工具条插件或代码 javascript问题 Nodeid is null or an object 怎么让页面以0.01秒的速度进行刷新 JS传参问题... 如何读二个下拉列表框的值? 求本地免激活javascript解决方案 一个url编码的问题 CONFIRM的按钮名字能换吗? 使用ActiveXObject("Wscript.Shell")读取本地注册表,如何去掉那个安全的提示 火狐中如何使用js改变img的src属性? 一个输入框显示剩余数字的问题了!帮帮忙吧!大虾们.
Ext.extend(AA,Ext.grid.EditGridPanel,{....});//定义AA从Ext.grid.EditGridPanel继承Ext.extend(BB,AA,{....});//定义BB从AA继承Ext.extend(CC,BB,{....});//定义CC从BB继承var cc=new CC();//实例化一个CC对象名称为cc//下面两段代码是创建一个Ext.Window对象win,把cc最为win的itemsvar win=new Ext.Window({
width:438,
height:315,
buttonAlign:"center",
title:'查询',
modal:true,
closeAction:"hide",
items:[cc],
buttons:[{text:"关闭",handler:function(){win.close();},scope:this}]
});
win.show();
此时如图:
点击"关闭按钮",然后在不刷新的情况下点击“open”如图
把这个div显示在Cell上面。通过调试,怀疑问题出在:点击关闭时,这个可编辑的div丢失了,而再次打开窗口时又没有创建这个可编辑的div,所以出错。
//----------------------------------------------------
小弟愚钝,已经搞一周了,毫无进展,望各位老大帮忙,谢谢
下载地址:
http://files.cnblogs.com/kuailewangzi1212/源代码解压开可执行cs。htm.rar
只是关闭后,再打开,原来编辑过的列,都不能再编辑了!你的代码是:
AA继承Ext.Panel 方法creategrid返回一个GridPanel
BB继承AA,并重载方法creategrid,返回一个EditGridPanel
CC继承BB
只是关闭后,再打开,原来编辑过的列,都不能再编辑了! 你的代码是:
AA继承Ext.Panel 方法creategrid返回一个GridPanel
BB继承AA,并重载方法creategrid,返回一个EditGridPanel
CC继承BB
//---------------------------------
对
//------------------------------------------------------------------------------------------
AA=Ext.extend(Ext.Panel,{
layout:"fit",
createstore:function()
{
return new Ext.data.SimpleStore(
{
data:[ ['1','mxh','aa','20080101','1','bb','bb'],
['2','mxh','aa','20080101','1','bb','bb'],
['3','mxh','aa','20080101','1','bb','bb'],
['4','mxh','aa','20080101','1','bb','bb'],
['5','mxh','aa','20080101','1','bb','bb'],
['6','mxh','aa','20080101','1','bb','bb'],
['7','zmm','aa','20080101','1','aa','aa']
],
fields:this.storeMapping
}
);
},
creategrid:function()
{
return new Ext.grid.EditorGridPanel({
store: this.store,
cm: this.cm,//
clicksToEdit:1
});
},
initComponent : function()
{ //初始化列表
this.store=this.createstore();//创建数据源
AA.superclass.initComponent.call(this);
this.grid=this.creategrid();
this.add(this.grid);//添加grid
//this.store.load();
}
});//---------------------------------------------------------------------------------------------------------------------------
CC=Ext.extend(AA,{
title:'标题',
width:400,
height:250,
storeMapping:[
{name:"Id",mapping:'id',type:'int'},
{name:"Name"},
{name:"Password"},
{name:"LastLoginTime"},
{name:"LoginTimes"},
{name:"Email"},
{name:"Re"}
],
cm:new Ext.grid.ColumnModel(
[
{header: "用户名", sortable:true,width: 100, dataIndex:"Name",editor:new Ext.form.TextField()},
{header: "密码", sortable:true,width: 100, dataIndex:"Password",editor:new Ext.form.TextField()},
{header: "电子邮箱", sortable:true,width: 100, dataIndex:"Email",editor:new Ext.form.TextField()},
{header: "上次登录时间", sortable:true,width: 100, dataIndex:"LastLoginTime",editor:new Ext.form.TextField()},
{header: "登录次数", sortable:true,width: 100, dataIndex:"LoginTimes",editor:new Ext.form.TextField()},
{header: "备注", sortable:true,width: 100, dataIndex:"Re",editor:new Ext.form.TextField()}
])
});
//----------------------------------------------------测试
window.onload=function()
{
Ext.get('btn_open').on('click',function(){
if(win)
win.show();
else
open_panel();
});
}var panel,win;
open_panel=function()
{
panel=new CC();
win=new Ext.Window({
width:600,
height:400,
buttonAlign:"center",
title:'查询',
modal:true,
//shadow:true,
closeAction:"hide",
items:[panel],
buttons:[
{text:"关闭",handler:function(){win.hide();},scope:this}]
});
win.show();
}
Ext.extend=function(this,o)
{
for(var i in o)
{
this[i]=o[i];
}
}
他只能实现简单的属性继承,存在很多问题,比如内存释放问题,
建议用这种继承方式
AA=function()
{
this.creategrid=function()
{
};
...
};
BB=function()
{
...
};
BB.prototype=new AA();CC=function()
{
};
cc.prototype=new BB();
//楼上这位兄弟的方法只是把panel和编辑框隐藏起来,并没有真正释放掉内存,如果是单个窗口时没问题,但是遇到复杂的界面就会出现很多问题
----------------------------------------------------//基类
//------------------------------------------------------------------------------------------
AA=function(){
this.createstore=function(){
return new Ext.data.SimpleStore(
{
data:[['0','mxh','0'],['1','zmm','1'],['2','nn','1']],
fields:this.storeMapping
}
);};
this.storeMapping=[{name:'id'},{name:'name'},{name:'sex'}];
this.cm=new Ext.grid.ColumnModel(
[
{header:'编号',dataIndex:'id',sortable:false,editor:new Ext.form.TextField()},//不可排序
{header:'姓名',dataIndex:'name',sortable:true,editor:new Ext.form.TextField()},//可排序
{header:'性别',dataIndex:'sex',sortable:true,editor:new Ext.form.TextField()}//
]
);
this.creategrid=function()//
{
return new Ext.grid.EditorGridPanel({
store: createstore(),
cm: this.cm,
layout:'fit',
width:300,
height:200,
title:'cs',
mode:false,
autoExpandColumn:2,//指定地第二列为自动拉伸列
clicksToEdit:1,//单击一次变为可编辑,默认为二次
loadMask:{Msg:'这个在加载数据...'}
})
};
};
//类BB
BB=function()
{
this.createstore=function(){return new Ext.data.SimpleStore(
{
data:[['0','mxh','0'],['1','zmm','1']],
fields:this.storeMapping
}
);};
this.storeMapping=[{name:'id'},{name:'name'},{name:'sex'}];
this.cm=new Ext.grid.ColumnModel(
[
{header:'编号',dataIndex:'id',sortable:false,editor:new Ext.form.TextField()},//不可排序
{header:'姓名',dataIndex:'name',sortable:true,editor:new Ext.form.TextField()},//可排序
{header:'性别',dataIndex:'sex',sortable:true,editor:new Ext.form.TextField()}//
]
);
};
BB.prototype=new AA();//类CC
CC=function()
{
this.createstore=function(){return new Ext.data.SimpleStore(
{
data:[['0','mxh','0']],
fields:this.storeMapping
}
);};
};
CC.prototype=new BB();
//----------------------------------------------------测试
window.onload=function()
{
Ext.get('btn_open').on('click',function(){open_panel();});//btn_getdiv
}open_panel=function()
{
var bb=new BB();
var gridbb=bb.creategrid();
var win = new Ext.Window({
width:600,
height:400,
buttonAlign:"center",
title:'查询',
modal:false,
shadow:true,
autoDestroy:true,
closeAction:"close",
items:[gridbb],
buttons:[
{text:"关闭",handler:function(){win.close();Ext.destroy(bb);},scope:this}]
});
win.show();
}
这好像是回复的第七个关于ext的帖子了,每次都是无满意结贴,以后不回答ext的帖子了,费力不少,还什么也
捞不着