0

私はこれを1日試してきましたが、うまくいきません。

私は主なアプリケーションを持っていますPlanner.mxml。このビューにはいくつかのカスタム コンポーネントがあり、そのうちの 1 つが ですLoginView.mxmlLoginView.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 に送信します。HTTPService は、要求を処理し、データベースをチェックして xml を返す単純な PHP ファイルです。(これは最善の方法ではないかもしれませんが、現時点ではあまり重要ではありません)。

ユーザーが正常にログインした場合、xml には に設定された status プロパティが含まれます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!");
            }
        }

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

ビューステートをログイン状態に変更できるメインアプリケーションでそれをリッスンしたいと思います。しかし、イベントは決してそこに到達しないようです。loggedIn="loggedInHandler(event)"loginComponent を使用してリッスンします。

これを行う方法はありますか?前もって感謝します。助けていただければ幸いです。

4

2 に答える 2

1

まず、ログインでイベント ディスパッチャーを拡張するか、IEventDispatcher を実装する必要があります。そこからイベントをディスパッチしようとしてコンパイラ エラーが発生する理由がわかりません。

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

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

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

于 2011-12-21T15:28:15.343 に答える
0

イベントをディスパッチする場合、このイベントに関心のある人はこのイベントにサブスクライブする必要があります。LoginView インスタンスからイベントをディスパッチする場合、このイベントを待機するオブジェクトで次のような行が必要です。

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

そしてハンドラーで:

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

必要なことをしてください。

于 2011-12-21T15:16:07.730 に答える