AS3在对象/类之间传递数据

时间:2010-12-27 23:17:12

标签: flash actionscript-3 oop class object

所以我建立了一个不同食物的分类菜单。我有一个“类别”(按钮)类,基本上会返回一个字符串“沙拉”,“饮料”等。我现在有另一个类“menuItems”的类别中的项目,这处理大小,如“小”,“我现在的问题是,当我返回“沙拉”时,我想调用一个包含沙拉所有元素的数组,将它发送到menuItems,它将填充菜单。到目前为止,我有类别对象和菜单对象设置。我似乎无法发送类别对象返回的数据并将其传递给菜单对象。这两个都被添加到舞台中,如下所示:

如果有一种方法我可以说将所有这些类添加到一个类中,这样他们就可以互相交流,这将是很好但我不知道如何做到这一点。

被困了几个小时,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:8)

在对象之间传递数据的一种常见方法是调度自定义事件。这具有减少类之间的依赖性的优点。例如,假设您想在结构中添加“Drinks”类,如果所有类彼此互连,则可能难以更新您的应用程序。另一方面,对于事件,您可以决定创建一个新的CustomEvent或者为当前事件添加一个drink属性,那么破坏的可能性会更加有限。

实际上,您需要一个事件调度程序,它将发送和接收事件,然后通知相关对象。

这是一个广泛的例子:

获取每个包并将它们保存在自己的文件中,为其命名为扩展名为.as的类(例如:Main.as)。所有文件应驻留在同一文件夹中。 Main.as将是您的入口点,如果您使用的是Flash CS,那么这将是您的文档类。

花点时间查看一些关于AS3的教程,这是我经常给出的建议,因为它可以节省你的头痛和浪费时间来试图解决基本问题。试试Colin Mook的Lost Actionscript Weekend Video Tutorial,例如,你应该在Adobe TV上找到它。

 package
 { 
 import flash.display.Sprite;
     import flash.events.EventDispatcher;

     public class Main extends Sprite
     {
      private var dispatcher:EventDispatcher; 

      private var salads:Categories; 
      private var menu:MenuItems; 

      public function Main()
      {
          dispatcher = new EventDispatcher();
          menu = new MenuItems( dispatcher );
          salads = new Categories( dispatcher );
      }
    }
 }


                         ******
 package
 {
   import flash.events.Event;

   public class MenuEvent extends Event
   {
     //Your Custom Event
     public static const CATEGORY:String = "Category";

     //Here I type the data property as an Object, but it could also 
     //be a String , depending on the type of info you need to pass
     public var data:Object;

     public function MenuEvent( type:String , data:Object ):void
     {
       super ( type );
       this.data = data;
     }

     override public function clone():MenuEvent
     {
         return new MenuEvent( type , data );
     }

 }
                         ******
 package 
 {

 import flash.events.EventDispatcher;
 import flash.events.MouseEvent;

     public class Categories
     {

       private var dispatcher:EventDispatcher;

       public function Categories(dispatcher:EventDispatcher ):void
       {
         this.dispatcher = dispatcher;

         //for this example, i dispatch the event here
         //so you don't have to create a button...
         dispatcher.dispatchEvent( new MenuEvent( MenuEvent.CATEGORY , "salads"  ) );
       }

       private function clickHandler( event:MouseEvent ):void
       {
         //for instance , in the "salads" category...
         dispatcher.dispatchEvent( new MenuEvent( MenuEvent.CATEGORY , "salads"  ) );
       }
     }
  }

                         ******
  package 
  {

 import flash.events.EventDispatcher;

     public class MenuItems
     {            
       private var dispatcher:EventDispatcher;

       public function MenuItems(dispatcher:EventDispatcher ):void
       {
         this.dispatcher = dispatcher;
         dispatcher.addEventListener( MenuEvent.CATEGORY , menuEventHandler );
       }

       private function menuEventHandler( event:MenuEvent ):void
       {
          trace( event.data as String);
       }
      }
    }