【问题标题】:AS3 Passing data between objects/classesAS3 在对象/类之间传递数据
【发布时间】:2010-12-27 23:17:11
【问题描述】:

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

如果有一种方法我可以说将所有这些类添加到一个类中,这样他们就可以互相交谈,那会很棒,但我不知道该怎么做。

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

【问题讨论】:

    标签: flash actionscript-3 oop class object


    【解决方案1】:

    在对象之间传递数据的一种常用方法是调度自定义事件。这具有减少类之间依赖关系的优点。例如,假设您想在您的结构中添加一个“Drinks”类,如果所有类都相互关联,那么更新您的应用程序可能会很困难。另一方面,通过 events ,您可以决定创建一个新的 CustomEvent 或为您当前的 event 添加饮料属性,破坏的机会更加有限。

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

    这是一个广泛的例子:

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

    不过,请花时间查看一些关于 AS3 的教程,这是我经常给出的建议,因为它可以为您节省大量的头痛和浪费时间尝试解决基本问题。例如,试试 Colin Mook 的 Lost Actionscript 周末视频教程,您应该可以在 Adob​​e 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);
           }
          }
        }
    

    【讨论】:

    • 是否可以给我一个使用调度程序的 2 个类的简单示例?我仍然是一个初学者,还不能真正解决这个问题。我习惯了 PHP,我所有的类都从 1 个类中扩展出来,通过这一类,可以与所有其他类进行交谈。到目前为止,它是如此令人沮丧,因为我一直使用 this ->>> (this.parent as MovieClip).someFunction(),将我的所有数据都返回给父级。这不是很有效。
    • 我以为我做到了,但我已经编辑了我的答案并为您提供了更多详细信息 :) 我还没有真正测试过它,所以我希望没有遗漏任何东西......
    • 老兄,这太棒了!非常感谢,正是我需要的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2016-07-22
    • 2011-04-24
    相关资源
    最近更新 更多