2011-12-21 1 views
0

私はこれを今一日試してきましたが、私はそれを解決できません。フレックスの外部ASクラスからイベントをディスパッチする際の問題

私はメインアプリケーションPlanner.mxmlを持っています。このビューにはカスタムコンポーネントがいくつかありますが、そのうちの1つは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); 
      } 
     } 

すべてのフィールドが完了している場合、私はチェックし、もしそうなら、私は、そのシンプルなPHPファイルでのHTTPServiceへの送信パラメータオブジェクトのコンストラクタパラメータを置きますリクエストを処理し、dbでチェックし、いくつかのxmlを返します。 (これは最善の方法ではないかもしれませんが、これは現時点ではあまり重要ではありません)。

ユーザーが正常にログインした場合、xmlにはtrueに設定されたステータスプロパティが含まれます。 HTTPサービスの結果イベントハンドラでこれをチェックします。これはすべてがうまくいかないところです。

protected function loginHandleResult(event:ResultEvent):void 
     { 
      if(event.result.status == true) 
      { 
       trace("logged in"); 
// here stuff goes wrong 
       var e:LoggedInEvent = new LoggedInEvent("loggedIn"); 
       dispatchEvent(e); 
      } 
      else 
      { 
       trace("not logged in"); 
       Alert.show("Wrong credentials.", "Oops!"); 
      } 
     } 

ご覧のとおり、ユーザーが正常にログインすると、カスタムイベントが送出されます。そうでない場合は、警告ボックスを表示します。しかし、このイベントはディスパッチされません(少なくとも、それを聞く方法はわかりません)。

私は主なアプリケーションでそれを聞きたいと思っています。そこで、私はviewstateをログイン状態に変更できます。しかし、このイベントは決してそこに到着しないようです。私はloggedIn="loggedInHandler(event)"をloginComponentに持っています。

どうすればいいですか?前もって感謝します。私は本当に助けていただければ幸いです。

答えて

1

まず、イベントディスパッチャーを拡張するか、IEventDispatcherを実装する必要があります。なぜ私はそれからイベントをディスパッチしようとするコンパイラのエラーを取得しているのか分からない。

次に、そのイベントの新しいLoginインスタンスをリッスンする必要があります。

ただし、ビューがビジネスロジックを処理するべきではないというアーキテクチャ上の問題があります。また、表示リストに独自の子ではない新しいオブジェクトを作成する必要はありません。

代わりに、ログインが発生したというREQUESTSのビューからイベントをディスパッチして、そのリクエストをさらに処理する必要があります。アプリケーションの規模に応じて、メインのmxmlファイル、または別のコントローラまたはコマンドロジックにすることができます。ですが、イベントをディスパッチする前に最小限の検証を行うことができますが、テストする方が簡単なため、PresentationModelにカプセル化したいのが理想です。

0

イベントを送信する場合は、このイベントに興味を持つ誰かがこのイベントを購読する必要があります。

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

とハンドラで:

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

を行うに必要なもの、あなたがこのイベントを待つオブジェクトで、その後LoginViewインスタンスからイベントを送出した場合 あなたは、このような行が必要です。

関連する問題