2011-01-05 50 views
0

我有一個類「pagecompiler」至極創建另一個類的子執行以下操作:adressing從getdefinitionbyname

if(page){ 
       removeChild(page); 
      } 
      switch (appModel.currentPage){ 
       case "Programma": 
       case "Winkelwagen": 
       case "Films": 
       case "Contact": 
       case "Reserveer": 
        var pageClass:* = getDefinitionByName("be.reynaertvincent.view.pages."+appModel.currentPage+"Page"); 
        page = new pageClass(); 
        addChild(page); 
        break; 
} 

所以它創建了一個頁面具體取決於交換機,名稱是(contactpage,filmspage,contactpage等)

這些頁面中的每一個都從一個名爲「頁面」的類擴展而來。

而在 「網頁」 類別i執行以下操作:

contentBg = new ContentBg(); 
sidebarBg = new SidebarBg(); 
addChild(contentBg); 
addChild(sidebarBg); 

現在我想什麼是應用在contentBg補間,當我做了在pagecompiler如下:

if(page){ 
    removeChild(page); 
} 

但我似乎無法從那裏尋找contentBg。我嘗試過:

if(page.contentBg){ 
    tweenlite.to(page.contentBg,blablabla); 
    //removeChild(page); 
} 

但它沒有得到承認。任何人有任何adeas?

回答

2

我看到了一些與你的代碼的問題。如果你改正,你的問題應該得到解決:

  1. 你應該堅持命名約定:類名稱應以大寫字母開頭。所以它應該是Page而不是page。否則,你有一個與類型名稱相同的成員變量 - 以及潛在的編譯錯誤。

  2. getDefinitionByName()在性能方面實例化類是昂貴的方法,並且由於它也不是類型安全的,因此您正在處理潛在的問題。既然你已經知道你要實例化的類,爲什麼不乾脆讓pagePage的情況下,延長您的switch語句:

    private var page:Page; 
    
    
    // some code here 
    
    
    switch (appModel.currentPage){ 
        case "Programma": 
         page = new ProgrammaPage(); 
         break; 
        case "Winkelwagen": 
         page = new WinkelwagenPage(); 
         break; 
        case "Films": 
         page = new FilmsPage(); 
         break; 
        case "Contact": 
         page = new ContactPage(); 
         break; 
        case "Reserveer": 
         page = new ReserveerPage(); 
         break; 
        } 
    addChild(page); 
    
  3. 如果您page*一個實例,如前文所提到,你需要投到Page類才能訪問其contentBg屬性。事情是這樣的:

    tweenlite.to (Page(page).contentBg, ....); 
    

最後這一點,但是,應該已經如果按照前兩個提示解決,因爲編譯器現在知道pagePage類型。這也是一個很好的例子,爲什麼上面提到的小寫命名不起作用,因爲page(page).contentBg顯然是不明確的。

+0

非常好的一點:)我不會鼓勵將contentBg作爲一個公共變量,但它似乎更好地保持它的保護,並簡單地發信號通知Page類在它被移除時處理它。 .. – PatrickS 2011-01-05 13:16:33

+0

這取決於Page類的其餘部分。如果它只是某些DisplayObject的便利容器,並且所有邏輯都發生在別的地方,那麼真的不需要封裝。 – weltraumpirat 2011-01-05 13:24:20

+0

哇,當我看到這樣的答案,我知道我有很多東西要學習。試試這個並且完美地工作。不知道你可以編譯這樣的東西。只要提到所有的課都以上流社會名稱命名。只是不習慣在Flash Builder之外打字。應該在示例代碼中添加它。 – vincent 2011-01-05 13:39:09

0

在你的網頁類,你可以創建一個公共方法:

public function removeFromStage():void 
    { 
     TweenLite.to (contentBg , etc... {..... onComplete: remove}) 
    } 

    //Called when the Tween is complete 
    private function remove():void 
    { 
     parent.removeChild(this); 

     //may come handy , don't forget to add a listener if you do this :) 
     dispatchEvent (new Event (Event.COMPLETE)); 
    } 

然後,你可以這樣調用

if(page != null){ 
    //add Complete event listener if necessary... 
    page.removeFromStage(); 
} 
+0

恥辱我只能接受1個答案,因爲這也是一個不錯的解決方案。以後會很有用,tyvm – vincent 2011-01-05 13:40:46

相關問題