2011-06-05 44 views
0

我有一個headerbar.mxml,當用戶在我的應用中swipes_down時顯示。 headerbar.mxml包含一個按鈕組件,我想在主應用程序窗口中運行一個erase()。主要應用程序是一個包含擦除()的繪圖應用程序。我只是不知道如何從另一個mxml視圖文件中調用一個函數。我認爲它會像click =「{mainwindow.drawPanel.erase()}」;Flex在另一個視圖上執行功能

編輯:

protected function onColorChange(event:List):void{ 
       appHome.drawArea.erase(); 
      } 

回答

2

要運行在另一視圖(AKA成分)這在很大程度上取決於體系結構的功能。這聽起來像你想在你的父母中運行一個功能。在這種情況下,'封裝正確'方法是從component1派發事件;在組件1的父項中偵聽事件;並從事件監聽器執行該功能。

所以,在headerbar母公司的地方,添加事件偵聽器:

headerbarInstance.addEventListener('parentDoSomething', onHeaderBarToldMeTo); 

我在構造函數中如果ActionScript 3的組件,或者如果MXML組件preinitialize事件處理程序可能添加此。在「父」組件也需要監聽功能:

protected function onHeaderBarToldMeTo(event:Event):void{ 
    erase(); 
} 

當點擊在headerbar.mxml的按鈕組件,這觸發關閉headerbar,這就需要調度的情況下,這樣的內部click事件處理程序:

protected function onButtonInheaderbarClick(Event:Event):void{ 
dispatchEvent(new Event('parentDoSomething')); 
} 

而且一切都應該神奇地工作。如果該功能不在家長的直接子女內,您可能必須冒泡。

如果你不關心封裝,你也可以直接訪問父節點。所以,你的標題欄組件這樣做:

parent.erase(); 

它的簡單和直接的,並且應該工作,但被認爲是從維護的立場來看可怕的壞習慣。

+0

謝謝我明白如何做到這一點,如果我只是在另一個視圖中引用functon,但是我忘記提及的是erase()是在我的主appview中實例化的drawArea對象中。所以我需要在另一個視圖中的對象上運行erase()。請參閱我的編輯。那正是我現在想要做的。 – RapsFan1981 2011-06-05 19:56:17

+0

@Casey Wylde如果'erase()'是一個視圖的孩子的公共方法;那麼一旦事件冒起來,而不是擦除「myChild.erase()」。我所說的一切都是真實的。 – JeffryHouser 2011-06-05 20:03:05

+0

您也可以使用FlexGlobals.topLevelApplication訪問頂級應用程序並以此方式調用該函數;但是從封裝的角度來看它也被認爲是不好的,因爲它提供了對組件的外部依賴。 – JeffryHouser 2011-06-05 20:04:53

相關問題