2011-12-21 77 views
0

我一直在嘗試這一點,現在我無法解決它。從Flex的外部AS類調度事件的問題

我有一個主要應用程序Planner.mxml。這個視圖有幾個自定義組件,其中一個是LoginView.mxml。在LoginView.mxml我做到以下幾點:

protected function btnLoginClick(event:MouseEvent):void 
{ 
    try 
    { 
     var login:Login = new Login(txtEmail.text, txtPassword.text);  
    } 
    catch(error:Error) 
    { 
     Alert.show(error.message, "Oops!"); 
    } 
} 

創建我Login類的新實例,併發送一些參數構造函數。我的構造是這樣的:

public function Login(email:String, password:String) 
     { 
      if(email == "" || password == "") 
      { 
       throw new Error("Please complete all fields."); 
      } 
      else 
      { 
       var loginRequest:HTTPService = new HTTPService(); 
       var parameters:Object = new Object(); 

       parameters.email = email; 
       parameters.password = password; 

       loginRequest.url = Globals.LOGIN_URL; 
       loginRequest.resultFormat = "object"; 
       loginRequest.method = "POST"; 
       loginRequest.addEventListener("result", loginHandleResult); 
       loginRequest.addEventListener("fault", loginHandleFault); 
       loginRequest.send(parameters); 
      } 
     } 

我在這裏檢查,如果所有字段都是完整的,如果是這樣,我把一個參數的構造函數的參數對象,然後我發到的HTTPService,這是一個簡單的PHP文件處理請求,檢查數據庫並返回一些XML。 (這可能不是最好的方式,但在這一點上它確實不是太重要)。

如果用戶成功登錄,則xml將包含一個設置爲true的狀態屬性。我在HTTP服務的結果事件處理程序中檢查了這一點。這是一切都出錯的地方。你可以看到,當用戶成功登錄時,我想分派一個自定義事件;如果沒有,我會顯示一個警告框。但是,這個事件並沒有派遣(或者至少,我不知道如何去聽)。

我想在我的主應用程序中偵聽它,然後我可以將viewstate更改爲登錄狀態。然而,事件似乎從來沒有達到過。我通過在我的loginComponent上有loggedIn="loggedInHandler(event)"來收聽。

任何想法如何做到這一點?提前致謝。我真的很感激任何幫助。

回答

1

首先,您的登錄需要擴展事件調度程序或實現IEventDispatcher。我不知道爲什麼你會收到編譯器錯誤,試圖從它派發事件。

接下來,您需要偵聽該事件的新登錄實例。

但是,您在這裏有一個體繫結構問題,您的視圖不應該處理業務邏輯,它應該明確地不是在顯示列表上創建不是其自己的子對象的新對象。

相反,您應該從請求發出登錄的視圖派發事件,然後應該進一步處理該請求。根據應用程序的規模,這可以是主要的mxml文件或單獨的控制器或命令邏輯。它好了,視圖在派發事件之前做了最少量的驗證,但理想情況下,您希望將這些內容封裝到PresentationModel中(因爲它更容易測試)。

0

如果您派遣活動,那麼對此活動感興趣的人必須訂閱此活動。 如果你從對象誰等待這個事件,然後LoginView實例分派事件中,你需要這樣的臺詞:

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

和處理程序:

private function loggedInHandler(event:LoggedInEvent):void 
{ 
    //do something 
} 

做你的需要。