我将问题描述一下,window中我放置了两个combobox,在tbar上设置按钮,负责显示window,并设置cancel按钮handler中函数,window.hide()令其隐藏。
一:单击tbar,window出来combobox,我没去动他,然后直接点cancel按钮,window隐藏,再点tbar,window正常显示出来,并且window中的组件完好。
二:问题出现,当我点开window,并且选了combobox中的选项后,我点cancel,也就是window.hide(),然后我又把window打开,这时,window中的combobox不见了。只有fieldLabel的文字。
请大家帮忙。
[code="js"]handler:function(){
var gradeWin = new Ext.Window({
title : '添加年级',
width : 300,
height : 150,
plain : true,
closeAction : 'hide',
layout : 'form',
labelWidth : 80,
constrain : true, // windows不超过浏览器
buttonAlign : 'center',
modal : true,// 生成背景半透明div
defaultType : 'textfield',
defaults:{width:160},
bodyStyle : 'padding:10px;',
buttons : [{
text : '确定',
handler:function(){
// var stuTreeNode = Ext.getCmp('stuTree');
// alert(Ext.getCmp('myTree')) ;
var tree = Ext.getCmp('myTree') ;
var stuNode = tree.getNodeById('stuTree') ;
var text = Ext.getCmp('gradeName').getValue().toString();
var type = Ext.getCmp('gradeType').getValue();
if(text != ''&& type != '')
{
var node = new Ext.tree.TreeNode({
text:text,
leaf:true
});
//stuNode.isLeaf = false ;
stuNode.appendChild(node);
gradeWin.hide();
}else Ext.Msg.alert('错误提示','有空选项,请重新填写');
//alert(tree.getNodeById('stuTree'));
}//ok function
}, {
text : '取消',
handler : function() {
gradeWin.hide();
}
}],
items :[{
xtype:'combo',
fieldLabel:'年级名称',
id:'gradeName',
displayField : "text",
valueField : "value",
mode : 'local',
triggerAction : 'all',
store : new Ext.data.SimpleStore({
fields : ['value',
'text'],
data : [['2004级', '2004级'],
['2005级', '2005级'],
['2006级', '2006级'],
['2007级', '2007级'],
['2008级', '2008级'],
['2009级', '2009级'],
['2010级', '2010级'],
['2011级', '2011级'],
['2012级', '2012级'],
['2013级', '2013级'],
['2014级', '2014级']
]
})
},{
xtype:'combo',
fieldLabel:'年级类型',
id:'gradeType',
readOnly : true,
displayField : "text",
valueField : "value",
mode : 'local',
triggerAction : 'all',
store : new Ext.data.SimpleStore({
fields : ['value',
'text'],
data : [['已毕业', '已毕业'],
['未毕业', '未毕业']]
})
}]//items
}) ;//end gradeWin
gradeWin.show();
}[/code]
楼主的做法不对,你既然将gradeWin对象放在hanlder事件中创建的话,那你多次点击后,就创建了多个gradeWin对象,你把gradeWin创建的部分放在外部即可,在hanlder调用的时候把gradeWin.show();出来即可。
把hide() 改成 close();
我测试通过了
[code="js"]
Ext.onReady(function() {
Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
var win = new Ext.Window({
width : 300,
height : 400,
tbar : [{
text : 'Show Window',
handler : function() {
var gradeWin = new Ext.Window({
title : '添加年级',
width : 300,
height : 150,
plain : true,
closeAction : 'hide',
layout : 'form',
labelWidth : 80,
constrain : true,
buttonAlign : 'center',
modal : true,
defaultType : 'textfield',
defaults : {
width : 160
},
bodyStyle : 'padding:10px;',
buttons : [{
text : '确定',
handler : function() {
var tree = Ext.getCmp('myTree');
var stuNode = tree.getNodeById('stuTree');
var text = Ext.getCmp('gradeName').getValue()
.toString();
var type = Ext.getCmp('gradeType').getValue();
if (text != '' && type != '') {
var node = new Ext.tree.TreeNode({
text : text,
leaf : true
});
stuNode.appendChild(node);
gradeWin.close();
} else {
Ext.Msg.alert('错误提示', '有空选项,请重新填写');
}
}
}, {
text : '取消',
handler : function() {
gradeWin.close();
}
}],
items : [new Ext.form.ComboBox({
fieldLabel : '年级名称',
id : 'gradeName',
displayField : "text",
valueField : "value",
mode : 'local',
triggerAction : 'all',
store : new Ext.data.SimpleStore({
fields : ['value', 'text'],
data : [['2004级', '2004级'], ['2005级', '2005级'],
['2006级', '2006级'], ['2007级', '2007级'],
['2008级', '2008级'], ['2009级', '2009级'],
['2010级', '2010级'], ['2011级', '2011级'],
['2012级', '2012级'], ['2013级', '2013级'],
['2014级', '2014级']]
})
}), new Ext.form.ComboBox({
fieldLabel : '年级类型',
id : 'gradeType',
readOnly : true,
displayField : "text",
valueField : "value",
mode : 'local',
triggerAction : 'all',
store : new Ext.data.SimpleStore({
fields : ['value', 'text'],
data : [['已毕业', '已毕业'], ['未毕业', '未毕业']]
})
})]
});
gradeWin.show();
}
}]
});
win.show();
});
[/code]
同意楼上的,把hide() 改成 close();
也可以改成destroy();
把 var gradeWin 改成 gradeWin 这样gradeWin就成了全局变量了,就不会第次都创建一个 window,而是覆盖原来的window