yourgame你好,
在你共享的“图书管理系统”中,ViewPort采用了border的布局方式(layout:'border'),
其中viewport中的west部分作为“菜单区”,
center部分作为“工作区”,
通过点击左边的某个菜单项,会在工作区内显示对应的操作界面,
同时工作区你采用的是card的布局方式(layout:'card'),
如此,只能够在工作区同一时刻显示一个交易画面(items:[start, p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book] 中的任意一个),
现在我想将“工作区”修改为tabpanel的布局方式,也就是达到如下效果——点击菜单,在工作区显示对应交易的画面panel,
如下图所以:
[img]E:/未命名2.bmp[/img]
我现在遇到的问题是,无法将原来的交易面板放入点击菜单后弹出的对应tabs中去!就像图中所示一样,弹出来的是空白的tabs:(
对“图书管理系统”中 main.js代码的调整如下(你可以直接查找“chg by”字样的地方):
Ext.BLANK_IMAGE_URL = 'lib/ext/resources/images/default/s.gif';
Ext.QuickTips.init();
var start = {
id : 'start-panel',
title : '欢迎使用',
layout : 'fit',
bodyStyle : 'padding:25px',
html : ''
};
Ext.onReady(function() {
setTimeout(function(){
/* 清除显示加载信息的div标记 */
Ext.get('loading').remove();
/* visible 使要素可以被看见
* hidden 使要素被隐藏
* inherit 指它将继承母体要素的可视性设置。
* 值 inherit 为缺省值。这使单元继承父单元的可见性。所以,如果某一段是隐藏的,则它包含的任何行间单元也都被隐藏。这一继承性可被明确指定的可见性取代。*/
Ext.getDom('header').style.visibility = 'visible';
/* 开始创建界面视图——程序可视区域
* 一个页面上只允许存在一个viewport */
var vp = new Ext.Viewport({
layout : 'border',
defaults : {
collapsible : true,
split : true
},
items : [{
xtype : 'box',
region : 'north',
applyTo : 'header',
height : 30,
split : false
}, {
xtype:'panel',
title : currentUser,
id : 'accordion-panel',
layout : 'border',
region : 'west',
baseCls:'x-plain',
margins : '2 0 5 5',
width : 200,
minSize : 200,
maxSize : 250,
bodyStyle : 'background-color:#DFE8F6',
defaults : {
border : false
},
bbar : [{
text : '开始',
iconCls : 'icon-plugin',
menu : new Ext.menu.Menu({
items : [{
text : '关于系统',
iconCls : 'icon-info',
handler : function() {
new Ext.Window({
closeAction : 'close',
resizable : false,
bodyStyle : 'padding: 7',
modal : true,
title : '关于本系统',
html : '本系统采用目前较为流行的技术实现,<br>前台使用了ExtJs技术,所以实现了跨浏览器<br>' +
'本程序在IE6,IE7,FireFox3均测试通过!<br><br>主要技术: Struts2 + Spring2.5 + iBatis2.3 + ExtJs2.2<br><br>'
+ '数 据 库: Microsoft SQL Server 2000',
width : 300,
height : 200
}).show();
}
}, {
text : '退出系统',
iconCls : 'icon-delete',
handler : function() {
Ext.Msg.confirm('操作提示', '您确定要退出本系统?', function(yorn) {
if ('yes' == yorn) {
Ext.Ajax.request({
url : 'logout.action',
success : function() {
location = '/bmsh/index.jsp';
},
failure : function() {
Ext.Msg.show({
title : '错误提示',
msg : '退出系统失败!',
icon : Ext.Msg.ERROR,
buttons : Ext.Msg.OK
});
}
});
}
});
}
}]
})
}],
items : [{
layout : 'accordion',
region : 'center',
items : [{
title : '导航菜单',
iconCls : 'icon-nav',
border : false,
items : [{
xtype : 'treepanel',
border : false,
rootVisible : false,
autoScroll : true,
loader : new Ext.tree.TreeLoader({
//根据界面勾选manager的值选择菜单项
dataUrl : nav == 'manager'
? 'js/tree-data-manager.json'
: nav =='mine'
?'js/tree-data-mine.json'
:'js/tree-data-simple.json'
}),
root : new Ext.tree.AsyncTreeNode(),
listeners : {
/* chg by megaecho 20090521
* 用tabPanel布局方式实现 菜单调出 工作区 交易界面
* 'click' : function(n) {
try {
//如果点击子叶点,则驱动显示相应的交易界面
//如何判定本次点击的node为原有的node呢? 就是不想重新加载页面。
var sn = this.selModel.selNode || {};// 方法:取原选定的node
if (n.leaf && n.id != sn.id) {
//Ext.Msg.alert("你点击了:"+n.id+"["+n.id.substring(0, n.id.indexOf('-'))+'-panel'+"]");
// 根据选中的菜单拼出panel,并指定载入到ViewPort中id为content-panel的标记
// 也就是将交易界面载入 region=center区域——指定活动items
Ext.getCmp('content-panel').layout.setActiveItem(n.id.substring(0, n.id
.indexOf('-'))
+ '-panel');
}
} catch (e) {
}
}*/
'click' : function(n){
//panel的命名规则:panel+'-panel'
var treePanelId = n.id.substring(0, n.id
.indexOf('-'))
+ '-panel';
//检查TabPanel(content-panel)中是否已经打开了id为treePanelId的panel
//无,则新建panel并且id为treePanelId
var tabTmp = Ext.getCmp('content-panel').getItem(treePanelId);
if(tabTmp==null){
alert("新打开"+treePanelId+"panel");
Ext.getCmp('content-panel').add({
xtype:'panel',
title: n.text,
id:treePanelId,
closable:true
}).show();
}else{
alert("panel"+treePanelId+"已经被打开,跳回已经打开的panel去");
alert(treePanelId+"has been created.....");
Ext.getCmp('content-panel').setActiveTab(tabTmp);
}
}
}
}]
}]
}]
},
/*
* chg by megaecho 20090521
* 用tabPanel布局方式实现 菜单调出 工作区 交易界面
{
id : 'content-panel',
region : 'center',
layout : 'card',
margins : '2 5 5 0',
activeItem : 0,
border : false,
//以下items定义了中间区域包含的交易界面(类),并且按照顺序进行载入 ,默认载入第一个,此处也就是先载入 start
items : [start, p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book]
}*/
{
title:'操作区域',
id:'content-panel',
region:'center',
xtype:'tabpanel',
margins : '0 1 1 0',
activeItem : 0,
border : false,
autoTabs : false,
hideCollapseTool :true ,
items:[start, p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book]
}]
});
}, 250);
});
希望这次表述清楚了,并且能得到你的帮助!谢谢!
[b]问题补充:[/b]
[code="java"]
'click' : function(n){
if( n.leaf ){
var treePanelId = n.id.substring(0, n.id.indexOf('-'))+'-panel';
var tabPanelTmp = Ext.getCmp('content-panel');
var tabTmp = tabPanelTmp.getItem(treePanelId);
if(tabTmp==null){
alert("新打开"+treePanelId+"panel");
/* 使用if..elseif 判断菜单对应的交易界面,并调出——成功*/
if( n.id == 'book-manage' ){
tabPanelTmp.add(p_book).show();
}else if( n.id == 'company-manage'){
tabPanelTmp.add(p_company).show();
}else if( n.id == 'dept-manage'){
tabPanelTmp.add(p_dept).show();
}else if( n.id == 'user-manage'){
tabPanelTmp.add(p_user).show();
}else if( n.id == 'duty-manage'){
tabPanelTmp.add(p_duty).show();
}else if( n.id == 'subject-manage'){
tabPanelTmp.add(p_subject).show();
}else if( n.id == 'category-manage'){
tabPanelTmp.add(p_category).show();
}
/* [新问题]:将上面if elseif 代替如下,根据传入的节点n得到对应的'p_XXXX'这样的名字,
* 以获得对p_XXXX的调用,达到自动使用以后交易的增加.....
* 但是执行 tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show();
* 却不能得到效果
tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show();
*/
}else{
alert("panel"+treePanelId+"已经被打开,跳回已经打开的panel去");
Ext.getCmp('content-panel').setActiveTab(tabTmp);
}
}else{
//alert("非叶节点");
}
}
[/code]
[b]问题补充:[/b]
谢谢issppt的帮助!
更是感谢yourgame,耐心的指导!
问题暂时解决了! 如你所说,我把p_xxxxx这些加入到新增加的panel对应的items参数中就ok了!
但是为了要根据点击菜单来选择对应的p_XXXX,我的做法相对死板
如下:
[code="java"]
'click' : function(n){
if( n.leaf ){
var treePanelId = n.id.substring(0, n.id.indexOf('-'))+'-panel';
var tabPanelTmp = Ext.getCmp('content-panel');
var tabTmp = tabPanelTmp.getItem(treePanelId);
if(tabTmp==null){
alert("新打开"+treePanelId+"panel");
[b]
/* 死板:使用if..elseif 判断菜单对应的交易界面,并调出——成功*/
[/b]
if( n.id == 'book-manage' ){
tabPanelTmp.add(p_book).show();
}else if( n.id == 'company-manage'){
tabPanelTmp.add(p_company).show();
}else if( n.id == 'dept-manage'){
tabPanelTmp.add(p_dept).show();
}else if( n.id == 'user-manage'){
tabPanelTmp.add(p_user).show();
}else if( n.id == 'duty-manage'){
tabPanelTmp.add(p_duty).show();
}else if( n.id == 'subject-manage'){
tabPanelTmp.add(p_subject).show();
}else if( n.id == 'category-manage'){
tabPanelTmp.add(p_category).show();
}
[b]
/* [新问题]:将上面if elseif 代替如下,根据传入的节点n得到对应的'p_XXXX'这样的名字,
* 以获得对p_XXXX的调用,达到自动使用以后交易的增加.....
* 但是执行 tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show();
* 却不能得到效果
tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show();
*/
[/b]
}else{
alert("panel"+treePanelId+"已经被打开,跳回已经打开的panel去");
Ext.getCmp('content-panel').setActiveTab(tabTmp);
}
}else{
//alert("非叶节点");
}
}
[/code]
[b]
现在想请教如何处理[新问题]?
[/b]
我想这个新问题关键还是自己对extjs没有理解所致,
对如下的代码段 的实质 和如何才能 引用未搞清楚!再次求教!
[code="java"]
var p_book = {
title:'图书信息管理',
id : 'book-panel',
border : false,
layout : 'fit',
closable:'true',
items : [book_panel]
}
[/code]
另外我通过网上的资料学习,掌握了向TabPanel中动态增加tabs的方法:
1.iframe方式
2.autoLoad方式
3.扩展Panel
资料连接:http://chenxueyong.iteye.com/blog/353371
大致能知道问题,应该是出在交易画面的panel的表单定义上,如果你把交椅画面的表单内容定义在外部,那么导致的情况是,所有的新生的tabpanel都是用是同一组表单元素,就会出现问题。
如果希望每点击一个结点,相应的tab中出现相应的交易表单,你应当在click事件中去把相应的交易表单拼接出来。
你可以试一下,因为没有看到你出错的图例,所以大致感觉是这个问题。
网上大把的示例呀。老大
[code="js"]
'click': function(n) {
var treePanelId = n.id.substring(0, n.id.indexOf('-')) + '-panel';
var tabTmp = Ext.getCmp('content-panel').getItem(treePanelId);
if (tabTmp == null) {
alert("新打开" + treePanelId + "panel");
Ext.getCmp('content-panel').add({
xtype: 'panel',
title: n.text,
id: treePanelId,
closable: true
}).show();
} else {
alert("panel" + treePanelId + "已经被打开,跳回已经打开的panel去");
alert(treePanelId + "has been created.....");
Ext.getCmp('content-panel').setActiveTab(tabTmp);
}
}
[/code]
我初步看了一下你的代码,你说打开的页面都是空白的,问题就在这个地方
当你打开新的tab页的时候每次都是下面的代码
[code="js"]
{
xtype: 'panel',
title: n.text,
id: treePanelId,
closable: true
}
[/code]
当然没有内容哦.我想你的意思是想打开其他的 "图书信息管理","部门管理","分公司管理"那些页面的内容.在我之前的代码中,这些页面的对象都是已经创建好了的.只是简单的控制他的显示而已.
所以你要把 items里面的p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book这些对象都在Ext.getCmp('content-panel').add()这个方法里面动态来创建.这样才能达到目的