仅基于其函数名称 - Ext Js从组件中删除事件侦听器

时间:2014-06-27 20:16:19

标签: javascript extjs

好吧,我有一个视口分为两半,顶部和底部。上半部分有总是可见的组合框和输入字段,下半部分有一个带有多个标签的标签面板。

当我更改上半部分中的一个静态组合框时,我将其称为组合框A,它会触发一个事件,并在其事件处理程序中A_handler,它将尝试在其中一个标签中设置另一个组合框的样式,我将其称为组合框B,但它可以执行以下两种操作之一。

组合框B显示在标签2上,而不是1

那么:

1)如果标签1处于活动状态,它会设置一个事件处理程序,以便在标签B处于活动状态时设置组合框2的样式。

2)否则,它会立即为它设置样式。

这就是问题所在:初始组合框A可以将组合框B设置为两种可能的方式之一,具体取决于选择,例如redblue

想象一下标签1可见的情况,我选择样式Bred的选项,然后为标签2创建事件处理程序被激活了。但是,如果不激活标签2,我会在组合A中再次更改该选项,以将B框设为blue

此时,我需要它来移除第一个事件处理程序,以便只触发一个。

我没有对事件处理程序的引用,但我已经命名了它们。

我已创建函数来获取选项卡2上的事件侦听器列表,并知道要删除的侦听器的名称,因此我可以匹配名称,但是当我尝试删除时范围不同他们使用标签removeListener,所以没有任何反应。

2 个答案:

答案 0 :(得分:0)

您可以将事件处理程序设置为仅运行一次:

someItem.on('event', function() {
    // ... bla bla bla ...
}, scope, {single:true});

答案 1 :(得分:0)

<强>解决

最终找到了解决方案。

unremoveListener功能设置如下:

un( eventName, fn, [scope] )

我的问题是我没有引用传递给fn的特定处理程序

解决方案涉及通过使用fn名称搜索来查找fn ref。

因此,在创建事件侦听器时,会使用名称

进行设置

myTab.on('activate', function doSomeStuff() {

稍后当我需要检查它是否存在/可能将其删除时:

objectHasNamedListener: function(obj, eventType, name) {
  var listeners = obj.events[eventType].listeners;

  //trim functionality since .trim() doesn't exist in old IE
  name = name.replace(/^\s+|\s+$/g, '');

  if (listeners != undefined) {
     for (var i = 0; i < listeners.length; i++) {
        var func = listeners[i].fn;
        var funcStr = func.toString();
        var funcName = funcStr.substr('function'.length);
        funcName = funcName.substr(0, funcName.indexOf('('));
        funcName = funcName.replace(/^\s+|\s+$/g, '');
        if (funcName == name) {
           return true;
        }
     }
  }
  return false;
},

如果返回true,则获取对该处理程序的引用:

if (this.objectHasNamedListener(myTab, "activate", "doSomeStuff")) {
    var listener = this.getNamedListener(myTab, "activate", "doSomeStuff");
    myTab.removeListener("activate", listener, this);
}




getNamedListener: function(obj, eventType, name) {
    var listeners = obj.events[eventType].listeners;

    name = name.replace(/^\s+|\s+$/g, '');

    if (listeners != undefined) {
       for (var i = 0; i < listeners.length; i++) {
          var func = listeners[i].fn;
          var funcStr = func.toString();
          var funcName = funcStr.substr('function'.length);
          funcName = funcName.substr(0, funcName.indexOf('('));
          funcName = funcName.replace(/^\s+|\s+$/g, '');

          if (funcName == name) {
             return func;
          }
       }
    }

    return null;

 },

另一个警告是,必须使用传入的相同作用域创建和删除侦听器,尽管它在API中列为[optional],因此传入此工作正常