0

1)首先我不想使用 CustomEvent 类。我正在寻找一些不使用 CustomEvent 的解决方案。

2)解决方案之一可以是在 ClassA 中使用 abc 变量。然后直接通过 ClassA 调度(而不是说 classB.dispatchEvent() )。但仍在寻找是否有比这更好的解决方案。


//Frame1 code :
import flash.events.Event;

var classA:ClassA = new ClassA() ;

classA.addEventListener("hello", hello); 
classA.init();
function hello(e:Event)
{
    trace(e.currentTarget.abc); //<<<< NEVER EXECUTED
}

//classA
package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class ClassA extends MovieClip 
    {

        var classB:ClassB ; 

        public function ClassA()
        {
            classB = new ClassB(); 

        }

        public function init()
        {
            classB.dispatchEvent( new Event("hello"));
        }

    }
}

//classB
package
{
    import flash.display.MovieClip;
    public class ClassB extends MovieClip
    {
        public var abc:Number =123;
        public function ClassB()
        {


        }




    }
}
4

2 回答 2

3

在使示例起作用之前,您缺少几个关键概念。首先,您在 的实例上调度事件ClassB,但是您正在侦听 的实例ClassA。因此,它们必须以某种方式关联,以便在事件被调度时正确编排。一种方法是使用事件冒泡。需要注意的是,本机事件冒泡仅适用于DisplayObjects,但您的两个类都继承自,MovieClip所以这没什么大不了的。

所以首先,你必须了解冒泡事件是如何工作的。一个简化的解释是,事件从显示层次结构的顶部开始,并沿着显示树向下捕获到元素,它们最终被调度到目标上,然后它们转身并以相反的方向冒泡。

这意味着您的实例ClassB必须是. 所以你必须改变的第一件事是在你的构造函数中:ClassAClassA

    public function ClassA()
    {
        classB = new ClassB();
        addChild(classB);
    }

接下来,当您调度事件时,您需要明确地说它是一个冒泡事件,否则它将在目标上触发,并且既不会捕获也不会通过显示堆栈冒泡。

    public function init()
    {
        classB.dispatchEvent( new Event("hello", true));
    }

的第二个参数true将事件设置为冒泡事件。

最后,您需要更改处理程序。现在,它正在使用e.currentTarget,在这种情况下,这不会是您所期望的(通常是这样,想)。

e.target您必须了解和之间的区别e.currentTargete.target是事件的实际目标,与它如何冒泡或捕获无关。e.currentTarget另一方面是当前正在处理事件的元素。因此,在您的情况下e.currentTarget,是ClassA(事件处理程序实际附加到的实例)e.target的实例,并且是ClassB(事件被调度的实例)的实例。在事件生命周期中,e.currentTarget会随着事件的移动而变化,但e.target应该始终保持不变。

在这种情况下,您希望引用事件的实际目标,而不是当前正在处理事件的元素。因此,您需要将处理程序更改为:

function hello(e:Event)
{
    trace(e.target.abc);
}

然后它应该工作。您可以在此处找到一个工作示例,该示例封装了我所描述的更改。

如果没有这些类,DisplayObjects那么您将不得不采取不同的方法——通过使用信号模式或手动侦听内部事件的重新触发ClassA

于 2012-09-10T13:56:17.140 回答
0

首先,您正在向 classA 添加一个事件侦听器,但您的 classA init 方法要求 classB 调度一个事件,这就是您的代码没有被执行的原因。如果你想捕捉 hello 事件,你应该做类似的事情

public function init()
    {
        this.dispatchEvent( new Event("hello"));
    }

或者您应该在 classB 上注册侦听器(不在范围内,因此没有代码建议)。

在 ActionScript 中,传输信息的最佳方法是使用自定义事件,因此我的建议是重新评估您对自定义事件的决定。

于 2012-09-10T12:53:14.253 回答