在AS3中添加自定义事件监听器

5

我在论坛帖子和教程中阅读了很多内容,但是仍然无法理解事件和事件监听器。我有一个非常简单的例子,但是我无法使它正常工作。

我在repeater中有一个自定义对象的arrayCollection,当其中一个对象被点击时,我想要另一个组件显示与该对象相关联的数据。

这是我的代码,但是侦听器从未响应(调度程序似乎正在工作,因为创建了新事件,并且我可以看到具有正确输出的跟踪)。我怀疑,我在错误的对象上调用addEvent Listener,导致侦听器无效。我的理解是,将显示对象数据的对象应该有事件侦听器,并监听所有此类事件,但也许我误解了。

我的自定义事件:

public class SelectObjectEvent extends Event
    {
        public function SelectObjectEvent(customEventString:String, myObject:customObject)
        {
              super(customEventString, true, false);
              trace(customEventString+" "+myObject);
        }
    }
}

我的自定义对象有以下函数,该函数在点击时被调用:

public function selectObject(myObject:customObject):void
        {
            dispatchEvent(new SelectObjectEvent("OBJECT_SELECTED", customObject));              
        }

我想展示所选对象的组件具有以下构造函数:

public function SelectedObjectDisplayClass()
        {
            addEventListener("OBJECT_SELECTED", this.showObject)
        }

        public function showObject(event:Event):void
            {  
            trace("Show object: "+event); 
        } 
2个回答

3

你最后两个代码块的位置不太清楚,但看起来你需要在继承 EventDispatcher 的对象上调用 addEventListener 方法。

也就是说,如果第二个代码块属于一个名为 Clickable 的自定义对象,该对象继承了 EventDispatcher,并在被点击时调用了 dispatchEvent() 方法,则你的组件应该调用 myClickable.addEventListener(...),其中 myClickable 是 Clickable 的实例。明白了吗?

但是假设你的第三个代码块不在与第二个相同的类中,那么看起来你没有这么做。你正在将侦听器添加到拥有第三个代码块的类上,我猜测这个类不是继承 EventDispatcher 的类。


好的...是的,第二块属于一个分派事件的对象,但它不可点击,并且据我所知,它没有扩展EventDispatcher(它扩展了UIComponent)。它是一个游戏对象,位于List组件中。当列表中的该对象被选中时,它会分派事件。每个分派事件的对象都必须扩展EventDispatcher吗? - Martholomew
也许我的问题在于List应该分派事件,并将选定的对象作为参数传递? - Martholomew
1
好的,DisplayObject 扩展了 EventDispatcher,所以舞台上的任何东西也是如此。我不知道谁应该分派事件 - 我想是谁知道何时这样做,但这取决于你的代码。确定的是,如果 A 分派事件,并且 B 接收它,则您的调用需要是 someA.addEventListener(eventType, someB.method)。现在,您似乎让 B 向自身添加事件侦听器。 - fenomas
谢谢。那就是问题所在。我在错误的对象上调用了addEventListener。 - Martholomew

0

快速浏览了一下你的代码,发现你的dispatchEvent第二个参数是类而不是对象实例。这应该是myObject才对吧?

public function selectObject(myObject:customObject):void
        {
                dispatchEvent(new SelectObjectEvent("OBJECT_SELECTED", **customObject**));                          
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接