2011-11-16 80 views
0

我有一个Flash应用程序,它可以创建一种幻灯片演示文稿。
所有'幻灯片'都存储在读取和处理的XML文件中。如何构建我的类以避免使用静态函数

我试图使用这个XML文件来构建演示文稿。

目前,我的主要类有它最初的功能main和静态函数processXML
main开始我database类名为initdb的功能。我的问题之一是initDB放弃处理,因为它依赖于事件监听器。在加载XML文件完成后,事件侦听器启动我的main上的静态函数以从此文件创建对象。

问题是因为事件监听器继续处理(在不确定的时间量之后),所以这些函数不再受main类的控制。
通常情况下,在这种情况下,我会避免使用静态的,因为我从主功能通过使用处理returns控制处理 - 即返回一个值拉控制权返回给调用者类的功能。

现在,所有这些都产生了敲门效应,我不能使用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 
} 

ContentDatabase类

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处理。

回答

2

Your Main & ContentDatabase类太紧张了!

你的数据被包含在一个XML文件中,实际上你需要先加载文件,解析,组织&存储数据,然后你可以操纵这些数据。

我不同意Sr.Richie,在这里真的不需要单身人士。

ContentDatabase应该简单地关心加载XML,最好的来源网址不得在课堂上被硬编码。

举例来说,你可以通过URL作为参数传递给initdb的方法

 database.initDB("resources/slides.xml"); 

数据后已经加载,好的做法是派遣一个事件来通知主类的数据准备。您可以使用CustomEvent或使用Signal并将数据作为对象传递。这样你就不会在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); 
    } 

有几种方式派遣&听&主类ContentDatabase之间活动。如上所述,您可以使用信号。您还可以通过将事件分派器传递给ContentDatabase来创建轻依赖关系。你这样做是为了确保同一个调度程序监听和分派事件。

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

则...

 this.dispatcher = dispatcher; 

那么的processXML()

private function processXML():void 
    { 
      // after all the processing 
      dispatcher.dispatchEvent(new XMLCustomEvent (introSlideXML)); 
    } 

在主类,当然还有

//In case of CustomEvent 
    public function main() 
    { 
     //the same dispatcher listens 
     dispatcher.addEventListener(XMLCustomEvent.XML_LOADED , 
             xmlLoadComplete); 
     database.initDB(); 
    } 

虽然可以使用XML a一个原生的AS3对象,我通常更喜欢创建自己的对象或类,使用XML数据填充它,以便我可以直接调用其属性,而不必查询XML,但这是个人的品味...

+0

嗨帕特里克,谢谢你的帮助! –

+0

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

+0

我真心希望这不是原因! – PatrickS

相关问题