我正在使用ExtJs4。
new Ext.Window({
id: token + '_window',
animateTarget: token + '_taskbar', //Button id
height: 300,
width: 300,
title: name,
maximizable: true,
minimizable: true,
iconCls: 'basketball-small-icon',
html: 'This is the <b>' + name + '</b> window',
listeners: {
'beforeclose': onWindowClose,
'minimize': function(){ this.hide(); }
}
请注意与动画目标关联的按钮。在这里onWindowClose被定义为
function onWindowClose(t){
var token = t.id.split('_')[0];
var taskBarItemId = token + '_taskbar';
Ext.getCmp(taskBarItemId).destroy(); //Destroying the button
t.destroy(); //Destroying the window
}
在这里我想删除窗口和相关的按钮。每次我关闭窗口,我都有两个选择,如下
- 我可以破坏按钮和窗户,但有时我无法再打开窗户。我认为这和按钮链接到窗口的"animateTarget"有关。因为当我删除此属性时,它可以正常工作
- 我可以用t.close()代替t.destroy(),但它变成了递归的。如何调用基关闭方法
每次都破坏窗口,每次点击图标都使用"new"创建,这是个好主意吗?close()和destroy()方法之间的区别是什么?
如果我理解得很好,您希望重用具有不同内容的窗口。因此,您应该只创建一个窗口,通过更新html内容并在此窗口上调用show()来重用它。要执行此操作,您需要添加属性closeAction:'hide'
。这样,当单击关闭按钮时,您的窗口不会被破坏。
test = new Ext.Window({
id: token + '_window',
animateTarget: token + '_taskbar',
height: 300,
width: 300,
title: name,
maximizable: true,
minimizable: true,
closeAction: 'hide',
iconCls: 'basketball-small-icon',
html: 'This is the <b> imad </b> window',
listeners:{
'beforehide':function(win){
Ext.getCmp(win.animateTarget).hide();
}
}
});
然后,您将这个监听器添加到您的按钮中:
listeners:{
'click':function(){
var token = t.id.split('_')[0];
var targetWindow = Ext.getCmp('token + '_window);
targetWindow.body.dom.innerHtml = 'Your new html !';
targetWindow.show();
}
}
您不必调用destroy(),因为一旦窗口关闭,它就会自动销毁
请参阅Ext.Window的api。
并且不要在beforecase处理程序中调用close(),因为它已经要关闭了
我认为,每当你想创建一个窗口并关闭它时,你可以使用"new"——点击关闭标题工具(右上角)或调用其close()方法。不要担心破坏。Ext会这么做。
close()和destroy()之间的主要区别是关闭"beforecluse"事件,并根据配置选项"closeAction"决定是关闭窗口还是隐藏窗口。如果它决定关闭,将调用destroy()。
编辑:尝试以下
function onWindowClose(t){
var token = t.id.split('_')[0];
var taskBarItemId = token + '_taskbar';
Ext.getCmp(taskBarItemId).destroy(); //Destroying the button
//t.destroy(); //Remove this statement.
return true;
}
EDIT2:删除最小化侦听器
listeners: {
'beforeclose': onWindowClose//,
//'minimize': function(){ this.hide(); }
}