我创建了一个TabPanel,比动态的给它添加tabs选项卡,每个选项卡上我一个关闭按钮。当我点这个关闭按钮关闭当前选项卡。然后在打开时,上面的内容就不显示了。我设置了CloseAction:'hide',也不起作用。在TabPanel属性中设置autoDistory:false,这时关闭在点开,我的TabPanel的布局活动的选项卡上会多加个空的panel。而且我点开的那个选项卡上也会增加一个空白的,请高手帮忙解决下。比分析下原因。谢谢 // 为属性菜单节点添加click事件
treeall.on('click', function(node) {
var nodeid = node.id;
var nodeText = node.text;
var items=tabs.getComponent(nodeid);
if (nodeid == 'cpfb') { // 设置活动的产品发布面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
closable : true,
region : 'center',
layout : 'fit',
iconCls : 'chart_bar',
id : nodeid,
closeAction : 'hide',
frame : true,
activeTab : nodeText,
height : 900,
style : 'padding:0px',
items : cpfb_tabpanel
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
}
}
treeall.on('click', function(node) {
var nodeid = node.id;
var nodeText = node.text;
var items=tabs.getComponent(nodeid);
if (nodeid == 'cpfb') { // 设置活动的产品发布面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
closable : true,
region : 'center',
layout : 'fit',
iconCls : 'chart_bar',
id : nodeid,
closeAction : 'hide',
frame : true,
activeTab : nodeText,
height : 900,
style : 'padding:0px',
items : cpfb_tabpanel
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
}
}
再次打开时页面中已经有一个id为nodeid的tab页,此时有冲突
解决方法:
1.去掉id属性
2.单击树节点时判断有无此id的tab页。有的话移除,可以用组件的destroy()方法销毁。
var tabpanel = win.get(1).get(0);
var n = tabpanel.getComponent(node.id);
if (!n) {
n = tabpanel.add({
id: node.id,
title: node.text,
closable: true,
html:""
});
tabpanel.setActiveTab(n);
} else {
tabpanel.setActiveTab(n);
}
}
/** *************************************** */
var treeall = new Ext.tree.TreePanel({
id : 'xicd',
border : false,
expanded : true,
collapsible : false,
rootVisible : false,
autoScroll : true,
useArrows : true,
animate : true,
enableDD : true,
loader : new Ext.tree.TreeLoader({
dataUrl : '../public/script/main/allView.json' }),
root : new Ext.tree.AsyncTreeNode(),
listeners : {
'render' : function() {
Ext.getCmp('xicd').getRootNode().expand(true, true);
}
}
});
/** *************************************** */ // 程序开始时右边显示的tabPanel
var tabs = new Ext.TabPanel({
activeTab : 0,
frame : true,
autoScroll : true,
activeItem : 0,
// 如果Tab过多会出现滚动条
enableTabScroll : true,
// 加载时渲染所有
// deferredRender:false,
layoutOnTabChange : true,
autoDestroy: true,
border : false,
items : [{
title : '首页',
xtype : 'panel',
frame : true,
layout : 'fit',
iconCls : 'home',
items : cpms == null ? zbxx : wel_panel
// //
// 判断是不是第一次登录,如果是第一次登录就显示zbxx,或者就显示welcome
}],
plugins : new Ext.ux.TabCloseMenu()
})
// 为属性菜单节点添加click事件
treeall.on('click', function(node) {
var nodeid = node.id;
var nodeText = node.text;
var items=tabs.getComponent(nodeid);
if (nodeid == 'cpfb') { // 设置活动的产品发布面板
if(!items){
items = tabs.add({
title : nodeText,
closable : true,
region : 'center',
layout : 'fit',
iconCls : 'chart_bar',
id : nodeid,
closeAction : 'hide',
frame : true,
activeTab : nodeText,
height : 900,
style : 'padding:0px',
items : cpfb_tabpanel
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
}else{
tabs.setActiveTab(items);
}
} else if (nodeid == 'xwfb') { // 设置活动的新闻发布面板
if (tabs.getItem('xwfb_tab')) {
tabs.setActiveTab('xwfb_tab');
tabs.doLayout(); // 重新计算布局
} else {
items = tabs.add({
title : nodeText,
frame : true,
closable : true,
//closeAction : 'hide',
iconCls : 'newspaper',
region : 'center',
id : 'xwfb_tab',
layout : 'fit',
activeTab : nodeText,
items : win_xwfb
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
} } else if (nodeid == 'jzpm') { // 设置活动的竞价排名面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
frame : true,
id : nodeid,
closable : true,
iconCls : 'rosette',
closeAction : 'hide',
layout : 'fit',
activeTab : nodeText,
items : jjpm_tab
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
} } else if (nodeid == 'cptj') { // 设置活动的产品推荐面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
frame : true,
closable : true,
id : nodeid,
iconCls : 'arrow_join',
closeAction : 'hide',
layout : 'fit',
activeTab : nodeText,
items : cptj_tabpanel
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
} } else if (nodeid == 'qykz') { // 设置企业快照面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
if (hydj == 1) {
Ext.MessageBox.alert('系统提示!', '你当前是铜牌会员没有权限操作,请升级会员等级')
} else {
items = tabs.add({
title : nodeText,
frame : true,
closable : true,
id : nodeid,
iconCls : 'arrow_join',
layout : 'fit',
activeTab : nodeText,
closeAction : 'hide',
items : win_qykz
});
}
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
} } else if (nodeid == 'logo') { // 设置活动的Logo设置面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
frame : true,
closable : true,
iconCls : 'lightbulb_off',
id : nodeid,
activeTab : nodeText,
closeAction : 'hide',
items : Logo_panel
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
} } else if (nodeid == 'ggsz') { // 设置活动的广告设置面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
frame : true,
closable : true,
id : nodeid,
iconCls : 'wrench',
layout : 'fit',
activeTab : nodeText,
closeAction : 'hide',
items : ggsz_panel
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
} } else if (nodeid == 'fgxz') { // 设置活动的风格设置面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
id : nodeid,
closeAction : 'hide',
frame : true,
closable : true,
layout : 'fit',
iconCls : 'comments',
activeTab : nodeText,
items : []
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
}
} else if (nodeid == 'zpxx') { // 设置活动的招聘信息面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
frame : true,
id : nodeid,
closable : true,
iconCls : 'shape_square_key',
layout : 'fit',
activeTab : nodeText,
closeAction : 'hide',
items : []
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
}
} else if (nodeid == 'yqlj') { // 设置活动的友情链接面板
if (tabs.getItem(nodeid)) {
tabs.setActiveTab(nodeid);
} else {
items = tabs.add({
title : nodeText,
frame : true,
layout : 'fit',
iconCls : 'link_edit',
id : nodeid,
closable : true,
activeTab : nodeText,
closeAction : 'hide',
items : yqlj_grid
});
tabs.setActiveTab(items);// 设置为活动面板
tabs.doLayout(); // 重新计算布局
}
} else if (nodeid == 'xgma') { // 设置活动的修改密码面板
pwd_win.show();
}
});
listeners:{remove:function(tp,c)
{
c.hide();
}
}/**作这个处理,为的是关闭一个tab后,再次打开时它还能显示出来*/
});
应该就可以了
autoDestroy: true,
改成
autoDestroy: false,
这个我试过,行不通~~这问题有木有解决的啊,现在也遇到这问题,头疼ING
第二次打开tabpanel 无法获取属性“parentNode”的值: 对象为 null 或未定义我跟了一下代码,问题出在
contentTabPanel.setActiveTab(newTab);
这个方法上,求解决办法啊......
这样 每次都定义一个id.
这个不好 用new 一个对象, 或者 <ifram html> 显示一个已存在的。
这个问题很奇怪 你关闭再打开是会报错
再关闭再打开就不会有错
反复很多次都有错
而且报错的时候 add返回的是false
本来想捕获异常再加载一次的都不行
有木有大侠啊
listeners:{
remove:function(tp,c)
{
c.hide(); }
}/**作这个处理,为的是关闭一个tab后,再次打开时它还能显示出来*/
第一句是将tab自动销毁设为false,然后覆盖原来销毁的方法改为隐藏,虽然不是非常好的解决办法,会占用内存,但是应付大部分工程还是没问题的
和tab的closeAction: 'hide'
就解决了。
ExtJS 4.1
其实办法挺傻的,就是弹窗口之前判断一下,有没有已经存在的窗口,有就显示那个,没有就另外开一个
check_before_create = function(widget_name) {
var all_widget = Ext.ComponentQuery.query(widget_name);
if(all_widget.length > 0){
all_widget[0].show();
}else{
Ext.widget(widget_name).show();
}
};