2011-07-16 5 views
1

Flash-PHPクライアントとサーバー間の通信を処理するクラスを作成します。基本的に、Flashは変数をPHPに送信し(PHPの場合はUIのボタンをクリックした後など)、PHPはFlashに値を送信します。パーサーとビューアップデータからデータを取得するクラスを切り離します

クラスは、次のように考えられます

package 
{ 
    import flash.net.URLLoader; 
    import flash.net.URLVariables; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    // 
    public class CSManager extends MovieClip 
    { 
     // 
     var scriptLoader:URLLoader; 
     // 
     public function CSManager() 
     { 
      scriptLoader = new URLLoader(); 
      scriptLoader.addEventListener(Event.COMPLETE, handleLoadSuccessful); 
      scriptLoader.addEventListener(IOErrorEvent.IO_ERROR, handleLoadError); 
     } 
     //; 
     public function handleLoadSuccessful($evt:Event):void 
     { 
      trace("Message sent."); 
     } 
     // 
     public function handleLoadError($evt:IOErrorEvent):void 
     { 
      trace("Message failed."); 
     } 
     // 
     public function sendLoad(variable):void 
     { 
      var scriptRequest:URLRequest = new URLRequest("http://mydomain/myapp/my.php"); 
      var scriptVars:URLVariables = new URLVariables(); 

      scriptVars.var1 = variable; 

      scriptRequest.method = URLRequestMethod.POST; 
      scriptRequest.data = scriptVars; 

      scriptLoader.load(scriptRequest); 
     } 

    } 

} 

だから、私はボタンで呼び出されるメソッドの本体に、私はこのクラスをインスタンス化し、CSManager sendLoadメソッドを呼び出すことを想像してみてください。

ご覧のとおり、sendLoadはサーバーにデータを送信し、は2つのメソッドが結果を処理します。 データが受信されると、アプリケーションはの結果を解析する必要がありますはビューを更新しますが、このクラスをパーサーとビューを更新するクラスから切り離して、サーバーからデータを取得するためにのみ使用します。 これは具体的には、データを解析して、handleLoadSuccessfulメソッドの本体の内部からビューを更新したくないことを意味しますが、私は別の解決策を探したいと思います。

この問題を解決するにはどのような方法が良いでしょうか。

編集:私はbetter piece of codeを見つけましたが、ここで問題は同じようです。

答えて

0

イベントを送信します。これは、コードをデカップリングする有効な手法の1つです。

クラスはMovieClipを拡張し、MovieClipはEventDispatcherを拡張するInteractiveObjectを拡張するSpriteを拡張します。このクラスを使用しているコードで

dispatchEvent(new Event(MYEVENT)); 

を、あなたはこのようなイベントに耳を傾けるでしょう:これは、あなたのオブジェクトはのEventDispatcherであるため、thuslyイベントを送出することができることを意味

var csManager:CSManager=new CSManager(); 
csManager.addEventListener(MYEVENT,myHandler); 

も、あなたはD「は、どこかに賢明な(CSManagerの静的クラスプロパティなど)

定義さ

const MYEVENT:String ="MYEVENT"; 

定数文字列を必要とします

あなたのイベントMYEVENTを呼び出すことを提案するのではなく、STRAWBERRIES_AND_CREAMのようなもっと意味のあるものに変更することができます。

+0

これは非常に興味深い見通しですが、データをresult/faultメソッドから取得するにはどうすればよいですか?私はあなたの考えは、result/faultメソッドの本体の中にdispatchイベントを置くことだと考えています。 –

+1

2つのオプションがあります.1つは、必要なデータを保持するカスタムEventクラス(extends Event)を作成し、そのインスタンスをディスパッチすることです。もう1つは、アクセスするデータ、つまりCSManagerのメソッド/プロパティを提供することです。これは最も簡単なソリューションであり、必要なデカップリングを提供します。 – Tom

+0

まず、あなたと私がとても親切に分かち合ったコードを少し修正しました。addEventListenerでは、MYEVENTではなく「EVENT」という文字列が私のために働いていました。私は最初の選択肢を完全に理解していましたが、第二の選択肢は私には分かりませんでした。 –

0

あなたはMVC patternについて聞いたことがありますか?そうでない場合は、ウィキペディアのページを読んでこれをよりよく理解してください。

「モデル」でクライアント/サーバー通信を行い、回答を受け取った後、ビューにイベント/通知を送信します。モデルはムービークリップである必要はありません。通常のクラスだけです。あなたがイベントを発生する場合、あなたはのEventDispatcher

public class MyModel extends EventDispatcher 
{ 
    // ... 

    private function onDate(evt:Event):void 
    { 
    // check if data was returned ... 
    dispatchEvent(new MyEvent("dataReceived", data); 
    } 
} 

から延びる可能性があり、眺めは「dataReceived」イベントをリッスンする必要があります。

public class MyView extends MovieClip 
{ 
    // ... 

    public function MyView(model:MyModel) 
    { 
    // check if data was returned ... 
    model.addEventListener("dataReceived", updateView); 
    } 

    private function updateView(evt:MyEvent):void 
    { 
     // parse data and do sth with it 
    } 
} 

と、あなたはすべてのインスタンスれるメインクラスだろう:

​​

をしたり、puremvcまたはrobotlegsのようなフレームワークを使用することができます - それは上でアプリケーションを構築するための良い出発点です...

+0

私はWikipediaを読んでいなくても少しMVCを知っています;-)私の質問は厳密にAS3と、このようなケースでそれを使用する方法(そして複数のプロジェクトでコードを再利用する方法)に関係しています。 –

0

この正確なトピックについては、blog postと書いてあります。うまくいけば、読んでみるといいでしょう。一言で言えば、Tomはお金を払っています。データを収集する準備が整ったらローダーでCOMPLETEイベントを送出してから、Mediator(ビューをアプリケーションの残りの部分から切り離すクラス)でデータをビューに渡すことができます。

関連する問題