所以我建立了一个不同食物的分类菜单。我有一个“类别”(按钮)类,基本上会返回一个字符串“沙拉”,“饮料”等。我现在有另一个类“menuItems”的类别中的项目,这处理大小,如“小”,“我现在的问题是,当我返回“沙拉”时,我想调用一个包含沙拉所有元素的数组,将它发送到menuItems,它将填充菜单。到目前为止,我有类别对象和菜单对象设置。我似乎无法发送类别对象返回的数据并将其传递给菜单对象。这两个都被添加到舞台中,如下所示:
如果有一种方法我可以说将所有这些类添加到一个类中,这样他们就可以互相交流,这将是很好但我不知道如何做到这一点。
被困了几个小时,非常感谢任何帮助。
答案 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);
}
}
}