Xml 如何构造类以避免使用静态函数

Xml 如何构造类以避免使用静态函数,xml,actionscript-3,class,event-listener,Xml,Actionscript 3,Class,Event Listener,我有一个Flash应用程序,可以创建一种powerpoint演示文稿。 所有“幻灯片”都存储在一个XML文件中,该文件将被读取和处理 我正在尝试使用这个XML文件构建演示文稿 目前,我的主类有它的初始函数main和一个静态函数processXML main使用名为initDB的函数启动我的数据库类。我的问题之一是initDB放弃处理,因为它依赖于事件侦听器。加载完XML文件后,事件侦听器在mymain上启动my static函数,从该文件创建对象 问题在于,由于事件侦听器继续处理(在不确定的时间

我有一个Flash应用程序,可以创建一种powerpoint演示文稿。
所有“幻灯片”都存储在一个XML文件中,该文件将被读取和处理

我正在尝试使用这个XML文件构建演示文稿

目前,我的主类有它的初始函数
main
和一个静态函数
processXML

main
使用名为initDB的函数启动我的
数据库
类。我的问题之一是initDB放弃处理,因为它依赖于事件侦听器。加载完XML文件后,事件侦听器在my
main
上启动my static函数,从该文件创建对象

问题在于,由于事件侦听器继续处理(在不确定的时间之后),因此函数不再由
main
类控制。
通常,在这种情况下,我会避免使用静态,因为我会通过在处理时使用
返回值
来控制主函数的处理,即返回值以将控制权拉回到调用方类的函数

现在,所有这些都产生了连锁反应,我不能使用addChild调用,或者任何类似的调用,因为函数是静态的

如果你能抽出一些时间,我真的需要重新思考我的文件工作方式

主类

public static var databaseXML:XML;
public var database:ContentDatabase = new ContentDatabase();

public function main()
{
    database.initDB();
}

public static function processXML()
{
    //Get First Slide
    var introSlide:SlideLayout = new SlideLayout();
    var allSlides:XMLList = main.databaseXML.children();
    var introSlideXML:XML;
    for each (var slide:XML in allSlides)
    {
        introSlideXML = slide;
        break;
    }
    var theSlide:MovieClip = introSlide.createSlide(introSlideXML);
    addChild(theSlide); //Fails, Obviously
}
private var xmlLoader:URLLoader;

public function initDB()
{
    xmlLoader = new URLLoader();
    xmlLoader.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
    xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
    xmlLoader.load(new URLRequest("resources/slides.xml"));
}

private function onComplete(e:Event):void
{
    try
    {
        main.databaseXML = new XML(e.target.data);
        xmlLoader.removeEventListener(Event.COMPLETE, onComplete);
        xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
        main.processXML();
    }
    catch (err:Error)
    {
        trace('broke: ' + err.message);
    }
}
private function onIOError(e:IOErrorEvent):void
{
    trace('broke: ' + e.text);
}
内容数据库类

public static var databaseXML:XML;
public var database:ContentDatabase = new ContentDatabase();

public function main()
{
    database.initDB();
}

public static function processXML()
{
    //Get First Slide
    var introSlide:SlideLayout = new SlideLayout();
    var allSlides:XMLList = main.databaseXML.children();
    var introSlideXML:XML;
    for each (var slide:XML in allSlides)
    {
        introSlideXML = slide;
        break;
    }
    var theSlide:MovieClip = introSlide.createSlide(introSlideXML);
    addChild(theSlide); //Fails, Obviously
}
private var xmlLoader:URLLoader;

public function initDB()
{
    xmlLoader = new URLLoader();
    xmlLoader.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
    xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
    xmlLoader.load(new URLRequest("resources/slides.xml"));
}

private function onComplete(e:Event):void
{
    try
    {
        main.databaseXML = new XML(e.target.data);
        xmlLoader.removeEventListener(Event.COMPLETE, onComplete);
        xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
        main.processXML();
    }
    catch (err:Error)
    {
        trace('broke: ' + err.message);
    }
}
private function onIOError(e:IOErrorEvent):void
{
    trace('broke: ' + e.text);
}
我愿意接受所有关于我如何构建这个项目以允许我进行这种交流的想法


理想情况下,我希望
ContentDatabase
类只包含XML处理。

您的Main&ContentDatabase类太多了

您的数据包含在一个XML文件中,实际上您需要首先加载文件,解析、组织和存储数据,然后才能操作此数据

我不同意Richie先生的观点,这里真的不需要单身汉

ContentDatabase应该只关心加载XML,理想情况下,源url不应该在类中硬编码

例如,可以将url作为参数传递给initDb方法

     database.initDB("resources/slides.xml");
加载数据后,最好的做法是发送一个事件,通知主类数据已准备就绪。您可以使用CustomEvent或使用,并将数据作为对象传递。这样,在Main和ContentDatabase类之间就不会有不必要的依赖关系

    private function onComplete(e:Event):void
    {
        try
        {
            main.databaseXML = new XML(e.target.data);
            xmlLoader.removeEventListener(Event.COMPLETE, onComplete);
            xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);

            //better process the XML data here...
            processXML();

        }
        catch (err:Error)
        {
            trace('broke: ' + err.message);
        }
    }

    private function processXML():void
    {
         // process the data...
         // inform the Main class by dispatching an Event
         // and pass the data as a parameter
         // use a CustomEvent or a Signal
     }
然后在你的主课上

     //If you use a CustomEvent
     private function xmlLoadComplete( event:XMLCustomEvent ):void
     {
         var introSlideXML:XML = event.introSlideXML;
         var theSlide:MovieClip = introSlide.createSlide(introSlideXML);  
     }
   //In case of CustomEvent
   public function main()
   {
       //the same dispatcher listens
       dispatcher.addEventListener( XMLCustomEvent.XML_LOADED , 
                                        xmlLoadComplete );
       database.initDB();
   }
有几种方法可以在主类和ContentDatabase之间分派和侦听事件。如上所述,您可以使用信号。您还可以通过向ContentDatabase传递事件调度程序来创建轻度依赖关系。这样做是为了确保同一个调度器侦听并分派事件

     public var database:ContentDatabase = new ContentDatabase(dispatcher);
然后在ContentDatabase contstructor中

       this.dispatcher = dispatcher;
然后在processXML()中

当然,在你的主课上

     //If you use a CustomEvent
     private function xmlLoadComplete( event:XMLCustomEvent ):void
     {
         var introSlideXML:XML = event.introSlideXML;
         var theSlide:MovieClip = introSlide.createSlide(introSlideXML);  
     }
   //In case of CustomEvent
   public function main()
   {
       //the same dispatcher listens
       dispatcher.addEventListener( XMLCustomEvent.XML_LOADED , 
                                        xmlLoadComplete );
       database.initDB();
   }

虽然可以将XML用作本机AS3对象,但我通常更喜欢创建自己的对象或类,用XML数据填充它,这样我就可以直接调用它的属性,而不必查询XML,但这是我个人的喜好…

等等!另一个人是否因为你不同意而删除了他的答案?