2011-11-16 24 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

相關問題