Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅根据组件的函数名-Ext Js从组件中删除事件侦听器_Javascript_Extjs - Fatal编程技术网

Javascript 仅根据组件的函数名-Ext Js从组件中删除事件侦听器

Javascript 仅根据组件的函数名-Ext Js从组件中删除事件侦听器,javascript,extjs,Javascript,Extjs,好的,我有一个分为两半的视口,顶部和底部。上半部分有组合框和始终可见的输入字段,下半部分有一个带有多个选项卡的选项卡面板 当我更改上半部分的一个静态组合框时,我将其称为组合框A,它会触发一个事件,并在其事件处理程序A\u处理程序,它会尝试在其中一个选项卡中设置另一个组合框的样式,我将其称为组合框B,但它可能会执行以下两种操作之一 组合框B在选项卡2上可见,而不是1 那么: 1) 如果tab1处于活动状态,则当tab2处于活动状态时,它将为组合框B设置样式的事件处理程序 2) 否则,它将立即对其进

好的,我有一个分为两半的视口,顶部和底部。上半部分有组合框和始终可见的输入字段,下半部分有一个带有多个选项卡的选项卡面板

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

组合框
B
在选项卡
2
上可见,而不是
1

那么:

1) 如果tab
1
处于活动状态,则当tab
2
处于活动状态时,它将为组合框
B
设置样式的事件处理程序

2) 否则,它将立即对其进行样式化

所以问题来了:初始组合框
A
,根据选择,可以设置组合框
B
两种可能的方式之一,例如
红色
蓝色

因此,想象一下选项卡
1
可见的情况,我选择将
B
样式设置为
red
,然后在激活选项卡
2
时创建事件处理程序。但是,在不激活选项卡
2
的情况下,我再次在combo
A
中更改选项,使框
B
变为
蓝色

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

我没有对事件处理程序的引用,但已将其命名


我创建了一些函数来获取选项卡
2
上的事件侦听器列表,并知道要删除的侦听器的名称,因此我可以匹配名称,但当我尝试使用选项卡的
removeListener
删除它们时,作用域不同,因此不会发生任何事情。

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

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

已解决

最终找到了解决办法

un
removeListener
功能的设置如下:

un(eventName,fn,[scope])

我的问题是,我没有要传递给
fn

解决方案包括通过搜索fn名称来查找
fn
ref

因此,在创建事件侦听器时,将使用以下名称对其进行设置:

myTab.on('activate',函数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;
},
objectHasNamedListener:函数(obj,eventType,name){
var listeners=obj.events[eventType]。监听器;
//修剪功能,因为旧IE中不存在.trim()
name=name.replace(/^\s+|\s+$/g');
如果(侦听器!=未定义){
for(var i=0;i
如果返回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;

 },
if(this.objectHasNamedListener(myTab,“activate”,“doSomeStuff”)){
var listener=this.getNamedListener(myTab,“激活”,“doSomeStuff”);
myTab.RemovelListener(“激活”,listener,this);
}
getNamedListener:函数(obj、事件类型、名称){
var listeners=obj.events[eventType]。监听器;
name=name.replace(/^\s+|\s+$/g');
如果(侦听器!=未定义){
for(var i=0;i

另一个警告是,必须使用传入的相同范围创建和删除侦听器,尽管它被列为[可选]在API中,传递这个函数很好

描述代码如何工作没有太多意义。发布一个测试用例。谢谢,但问题不是事件处理程序持续存在,事实上我已经将它们设置为只触发一次。我的问题是,我需要一种方法在事件处理程序触发onceSo之前删除它,请使用
un
方法删除事件。
un
方法如下:
un(eventName,fn,[scope])
需要引用事件处理程序函数,我无权访问该函数,因此我的标题部分说“…基于其函数名”也许我在文章中解释得不够好。我无法访问处理程序的函数ref,因为所有这些代码本身都在更广泛的事件处理程序中,并且没有任何东西可以持久化-例如,没有附加到全局对象的属性,或者全局varsThanks以获得帮助,但我找到了一个解决方案。它检索funct通过从函数名中进行查找来执行ion ref