ExtJs删除和添加侦听器。缓存问题

时间:2015-09-29 11:55:55

标签: javascript extjs extjs4

我有一个对象,它使用所有内部结构(窗体,其他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工作???

1 个答案:

答案 0 :(得分:1)

removeListener期望函数引用作为第二个参数。

如果您在每次显示窗口时都添加了此代码,则single: true上的addListener可能会解决您的问题(因此您无需{{1} }),尝试:

removeListener

如果情况并非如此,您需要保存对winCache[id_group].addListener('show', function () { }, null, { single: true }); 函数的引用,并将其传递给show,以便您可以将其传递给addListener ,或者可以使用removeListener,例如:

destroyable