我有一个对象,它使用所有内部结构(窗体,其他ui元素)缓存窗口。因此,当用户打开一个已经缓存的窗口时,它会从头开始创建它,但是从缓存中获取,并且只显示如下:
winCache[id_group].show();
因此,对于每个id_group
,可以在window
中缓存winCache
。问题是我要重置form
,它位于window
内,并使用数据库中的新数据填充它。我试着这样做:
if(winCache[id_group]){
winCache[id_group].removeListener('show');
winCache[id_group].addListener('show', function () {
populate_form(this, id_field); // <-- this method retreives data from database
// and sets the form
});
winCache[id_group].show();
}
else { // window was not cached and has to be created from scratch
var win = ...
win.show();
// ... some BIG procedure
winCache[id_group] = win; // next time it will be taken from cache
}
但问题是,出于某些疯狂的原因,ExtJS
无限地重复show
个听众。因此,例如,如果我为同一winCache[10]
= id_group
打开10
七次,但对于不同的id_field
s(id_field = 1,id_field = 2,.. 。,id_field = 7),然后show
监听器将被触发七次 - 对于每个id_field。这是令人难以置信的愚蠢。所以,我的问题是为什么ExtJS
重复听众?为什么没有removeListener
工作???
答案 0 :(得分:1)
removeListener
期望函数引用作为第二个参数。
如果您在每次显示窗口时都添加了此代码,则single: true
上的addListener
可能会解决您的问题(因此您无需{{1} }),尝试:
removeListener
如果情况并非如此,您需要保存对winCache[id_group].addListener('show', function () {
}, null, { single: true });
函数的引用,并将其传递给show
,以便您可以将其传递给addListener
,或者可以使用removeListener
,例如:
destroyable