0

我必须在其他人开始的项目上工作,但由于他目前不在国外,因此无法联系到他。反正。有一个主 mxml 和一个名为“admin”的自定义组件。

在管理员中,他宣布了这样一个事件:

    <fx:Metadata>
    [Event(name="sluitFrame")]
</fx:Metadata>

在组件内的某个函数中,这个事件被这样调用:

dispatchEvent(new Event("sluitFrame"));

此事件 sluitFrame 使用一些管理工具关闭一个框架。我需要改变它的工作方式,所以我想找到相应的代码。在主 mxml 上有以下代码:

                <comp:Admin id="compAdmin" creationPolicy="none"
                         sluitFrame="verbergAdminComponent(event)"/>

因此,如果我正确理解 sluitFrame 调用甚至称为“verbergAdminComponent(event)”的自定义。所以我想我需要这个事件来改变管理框架的关闭方式等。但是这个事件无处可寻。所以我不明白“verbergAdminComponent(event)”是如何工作的,或者我可以在哪里更改这个事件。

任何帮助都非常受欢迎并且非常需要:)

4

3 回答 3

2

[Event...行只是让编译器和 IDE 知道组件/类(在本例中为Admin)可以按该名称调度事件。这很重要,因为当有人在 MXML 标记中声明 Admin 的实例时,编译器知道此事件(在本例中sluitFrame为 )是有效属性。换句话说,它让编译器知道您可以在 MXML 标记中设置事件侦听器。在您的情况下,每次Admin对象调度sluitFrame事件时,verbergAdminComponent都会调用该函数并将 sluitFrame 事件传递给它。

于 2012-06-11T01:27:10.750 回答
1

事件类型

如果您Event在 Flash 中使用 an,您可以调度任何命名类型,因为它是一个字符串。所以不管你怎么称呼它,只要听者听的是完全相同的type。这就是它起作用的原因。没有魔法进化。但是,在这种情况下,我会选择使用自定义事件。

自定义事件的工作原理

看看自定义事件的工作原理,这样您也可以了解元数据的来源。

package com.website.events
{
    import flash.events.Event;

    /**
     * @author ExampleUser
    */
    public class MyCustomEvent extends Event
    {
        /** 
         * 
         */
        public static const CLOSE_WINDOW:String = "MyCustomEvent.closeWindow";


        public function MyCustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false):void 
        { 
            super(type, bubbles, cancelable);
        }

        override public function clone():Event 
        { 
            return new MyCustomEvent(this.type, this.bubbles, this.cancelable);
        } 

        override public function toString():String 
        { 
            return formatToString("MyCustomEvent", "type", "bubbles", "cancelable", "eventPhase"); 
        }
    }
 }

我使用静态常量而不是直接使用字符串(如您的示例),因此输入更严格。

在 actionscript 中,您将像这样调度自定义事件。假设您创建了一个名为 Window 的类。

package com.website.ui
{
   /**
    * @eventType com.website.events.MyCustomEvent.closeWindow
   */
   [Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]

import flash.display.Sprite;
import flash.events.MouseEvent;
import com.website.events.MyCustomEvent;

/**
 * @author ExampleUser
*/
public class Window extends Sprite
{
    public var mcCloseButton:Sprite;

    public function Window():void 
    { 
        this.mcCloseButton.addEventListener(MouseEvent.CLICK, handleCloseButtonClick);
    }

    private function handleCloseButtonClick(event:MouseEvent):void 
    { 
        this.dispatchEvent(new MyCustomEvent(MyCustomEvent.CLOSE_WINDOW));
    }

}
}

是元数据应该位于的类。此类正在调度事件。调度相同事件的其他类也可能具有元数据。

因此,当用户单击关闭按钮时, Window正在调度一个带有类型的事件。CLOSE_WINDOW在另一个文件中,你会听它并用它做一些事情。

package com.website
{
import flash.display.Sprite;
import com.website.events.MyCustomEvent;
import com.website.ui.Window;

/**
 * @author ExampleUser
*/
public class Main extends Sprite
{
    private var _window:Window;

    public function Main():void 
    { 
        this._window:Window = new Window();
                    // a smart code-editor would give you a hint about the possible events when you typed "addEventListener" 
        this._window.addEventListener(MyCustomEvent.CLOSE_WINDOW, handleWindowClosed);
        this.addChild(this._window);
    }

    private function handleWindowClosed(event:MyCustomEvent):void 
    { 
        // do something
        this._window.visible = false;
    }
}
}

这应该有效。当然在现实世界的情况下MyCustomEvent会被命名为WindowEvent.

事件元数据

元数据可用于向编译器提供提示,而如今的智能代码编辑器(FDT、FlashDevelop、FlashBuilder、IntelliJ 等)可以提供代码补全。它基本上是对类可以调度什么样的事件的描述,因此您知道可以使用哪些侦听器。

即使元数据被删除,代码也应该可以工作。

事件元具有 aname和 a type。名称应该是类型的确切值。在我们的例子中,它应该是 的值CLOSE_WINDOW,所以是MyCustomEvent.closeWindow。类型应该是带有完整包的类名,在我们的示例中,它将是“com.website.events.MyCustomEvent”。

最后,元数据如下所示:

[Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]

顺便说一句,我对您的代码有一些提示:

  • 我建议使用英文函数名和参数,而不是荷兰文。
  • verbergAdminComponent不是一个好名字的处理程序,它应该是类似的handleCloseWindow(event),它应该调用verbergAdminComponent函数。
于 2012-06-11T08:57:33.927 回答
1

verbergAdminComponent 将是事件处理程序的名称。它应该是 mxml、包含的 .as 或该 MXML 的基类中的方法。

于 2012-06-11T00:32:08.720 回答