2011-12-01 22 views
2

我還沒有完全地瞭解自定義組件是如何工作的?Flex的自定義組件,最好的方式來使用它

假設我有我的Main.mxml應用

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" 
     xmlns:local="*"> 
    <fx:Script> 
     <![CDATA[ 
      private var privateStr:String = "Stringa Private"; 
      public var publicStr:String = "Stringa Public"; 
     ]]> 
    </fx:Script> 
    <local:AddUser height="100" width="500"/> 
    <s:Label id="lblText" x="120" y="120" width="418" height="115" text="!!!"/>          
</s:WindowedApplication> 

和組件AddUser.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:VBox 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    creationComplete="initialize_component()"> 
    <fx:Script> 
     <![CDATA[            
      public var btnName:String = "Login"; 
     private function initialize_component():void 
     { 
      login.label = btnName;    
      } 
      private function doLogin():void 
      { 
      //some stuff here 
      } 

     ]]> 
    </fx:Script> 
    <s:TextInput id="txtuser" x="96" y="36"/> 
    <s:TextInput id="txtpass" x="96" y="66"/> 
    <s:Button id="login" x="96" y="96" width="128" click="doLogin()" /> 
</mx:VBox> 

我想在按鈕上(登錄)點擊我得到的publicStr/privateStr是在main.mxml ... 難道我讓一切錯了嗎?我怎樣才能使用更多的組件,例如它們都是同一個應用程序的一部分,並使用相同的變量/方法?

回答

2

看來你似乎有與封裝的想法問題。子組件不應該知道父組件,View組件不應該做真正的工作,只需要從Controller組件中請求工作。在非常簡單的項目中,頂層組件可以包含控制器邏輯,但許多人更願意在小型項目中保持獨立。如何做到這一點超出了這個答案的範圍。

那麼,父母和孩子應該如何正確溝通?子組件應公開屬性,父項(或Framework,如果您準備使用依賴注入框架)可以僅填充子組件需要的數據。

子組件通過生成事件向控制器請求工作。

所以,doLogin()將containe像

dispatchEvent(new Event('doLogin')); 

與父組件將被監聽此事件。在其處理程序中,您將執行登錄。更可能的是,您的登錄將是異步的,所以您需要另一個處理程序來監聽登錄數據才能返回。當登錄數據返回時,您將根據返回值在登錄視圖中設置屬性。

相關問題