2011-02-12 53 views
4

我試了一下,發生這種情況時,我很難弄清楚如何在TabbedMobileApplication中的ViewNavigator之間傳遞數據。如何在Flash Builder 4.5中的ViewNavigator之間傳遞數據Burrito

<s:TabbedMobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark"> 
    <fx:Declarations> 
    </fx:Declarations> 

    <s:ViewNavigator id="nav1" label="Nav1" firstView="views.Nav1Home" width="100%" height="100%"/> 
    <s:ViewNavigator id="nav2" label="Nav2" firstView="views.Nav2Home" width="100%" height="100%"/> 

</s:TabbedMobileApplication> 

如何在nav1和nav2之間傳遞數據?我知道如何在導航視圖之間做到這一點。

感謝, B.

回答

1

除非我失去了一些東西,你會想要做的是在這裏一個腳本塊,聽你的ViewNavigators事件。然後在該事件的處理程序中,調用目標ViewNav上的公共函數。

<s:TabbedMobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="init()"> 
    <fx:Declarations> 
    </fx:Declarations> 

    <fx:script><![CDATA[ 
     private function init():void{ 
       nav1.addEvenListener(CustomEvent.DATA, onData); 
     } 

     private function onData(ev:CustomEvent):void{ 
       nav2.setData(ev.data); 
     } 
    ]]></fx:script> 



    <s:ViewNavigator id="nav1" label="Nav1" firstView="views.Nav1Home" width="100%" height="100%"/> 
    <s:ViewNavigator id="nav2" label="Nav2" firstView="views.Nav2Home" width="100%" height="100%"/> 

</s:TabbedMobileApplication> 
+0

TJ,謝謝。這個概念在一些小的變化下工作得很好。 – 2011-02-13 00:24:15

1

TJ已經說得對。剛剛發佈萬一有人最後的例子得到了同樣的問題:

TestApplication.mxml

<s:TabbedMobileApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         creationComplete="init()"> 
<fx:Declarations> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 

     private function init():void{ 
      nav1.activeView.addEventListener(CustomEvent.DATA, onData); 
      nav2.activeView.addEventListener(CustomEvent.DATA, onData); 
     } 

     private function onData(ev:CustomEvent):void{ 
      nav1.activeView.data = ev.data; 
      nav2.activeView.data = ev.data; 
     }   
    ]]> 
</fx:Script> 

<s:ViewNavigator id="nav1" label="Nav1" firstView="views.Nav1Home" width="100%" height="100%"/> 
<s:ViewNavigator id="nav2" label="Nav2" firstView="views.Nav2Home" width="100%" height="100%"/> 

CustomEvent.as

package 
{ 
import flash.events.Event; 

public class CustomEvent extends Event 
{ 
    public static var DATA:String = "DATA_EVENT"; 
    public var data:Object = null; 

    public function CustomEvent(data:Object, type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
     this.data = data; 
    } 
} 

}

views.Nav1Home.mxml

<?xml version="1.0" encoding="utf-8"?> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
     private function init(): void { 
      this.addEventListener(FlexEvent.REMOVING, removedHandler); 
     } 

     private function removedHandler(event:Event):void { 
      trace("Removed from stage: " + data); 
      this.dispatchEvent(new CustomEvent("Data from Nav1 Event", CustomEvent.DATA)); 
     } 
    ]]> 
</fx:Script> 

views.Nav2Home.mxml

<?xml version="1.0" encoding="utf-8"?> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[   
     private function init(): void { 
      this.addEventListener(FlexEvent.REMOVING, removedHandler); 
     } 

     private function removedHandler(event:Event):void { 
      trace("Removed from stage: " + data); 
      this.dispatchEvent(new CustomEvent("Data from Nav2 Event", CustomEvent.DATA)); 
     } 
    ]]> 
</fx:Script> 

2

我想補充一點,我更喜歡在什麼已經討論了更加鬆散耦合的溝通機制。我更喜歡某種類型的事件聚合系統,在這種系統中,解耦組件發送消息時彼此不知道其他消息。

這種類型的事件系統內置於輕量級框架中,如Parsely和Robot Legs。

這主要是一種風格的東西,但根據我的經驗,我們越緊密地耦合這種溝通,我們就越支付這筆費用。

思考的食物,我想。 :)

+0

我同意這是一個有點麻煩,但迄今爲止我發現這樣做的唯一途徑。關於訪問數據的機制,我認爲通過MobileApplication實例可以訪問單個靜態數據屬性就足夠了。非常像一個正常的單身人士。這些視圖應該能夠訪問它。 – 2011-02-14 18:40:12

2

一個簡單的方法是使用ViewNavigator將您的數據對象添加到視圖中。然後在孩子們的意見,以此來獲得數據:

this.parentDocument.yourDataObject 
0

最簡單的方法,如果使用的ViewNavigator視圖之間轉變,只是傳遞一個數據對象的觀點:

在視圖1

private function view1_clickHandler(event:Event):void { 
    var trans:FlipViewTransition = new FlipViewTransition(); 
    var obj:Object = new Object(); 
    obj.showPrevBtn = false;      
    FlexGlobals.topLevelApplication.tabNavigator.pushView(View2, obj, null, trans); 
} 

在視圖2:

protected function view2_addedToStageHandler(event:Event):void 
{ 
    if(prevBtn != null && this.data != null && this.data.showPrevBtn === true) { 
    prevBtn.visible = true; 
    } else if(prevBtn != null && this.data != null && this.data.showPrevBtn === false) { 
    prevBtn.visible = false; 
    } 
} 
相關問題