2011-07-31 12 views
0

私はFlex初心者ですが、StackOverflowとGoogleの両方を検索しましたが、Flex/ActionScript 3のこの(単純な)プログラミング。私はテーブルに行を挿入するPHPサービス(Zend)を持っています。私がしたいのは、異なる行の値で2回連続してサービスを呼び出し、サービスから返された新しいID(主キー)を取得することです。次に、新しいIDを2アラートとして表示します。Flex 2のサービスコールから最後の2つの結果を取得するPHP

問題は、私がサービスを2回連続して実行できるようになったときに、最新のサービス呼び出しのためだけにAlert.show()を取得することです。私は最初の結果にアクセスする方法を知らない。

FlexコードとPHPサービスをオブジェクトの配列を受け入れるように再構成して、両方に対して単一のPHPサービス呼び出しを送信し、配列オブジェクトを結果とともに受け取ることができると認識しますが、 AsyncTokenがどのように動作しているか、そして私が必要とする古い結果にアクセスする方法を一般的に理解してください。以前の結果を{serviceResult} .tokenで上書きしていますか?

// imports 
import mx.collections.ArrayCollection; 
import mx.controls.Alert; 
import mx.events.CloseEvent; 
import mx.events.FlexEvent; 
import mx.rpc.AsyncToken; 
import mx.rpc.IResponder; 
import mx.rpc.events.FaultEvent; 
import mx.rpc.events.ResultEvent; 
import mx.rpc.remoting.mxml.RemoteObject; 
import mx.rpc.Responder; 
import spark.events.IndexChangeEvent; 

import valueObjects.Folders; 


// When the user clicks "Save" button, 2 new folders are created for a new user: 
protected function pendingUserSaveButton_clickHandler(event:MouseEvent):void 
{ 
     // Create 2 initial user folders: Home and temp-taiwan 
     var t1Folders:Folders = new Folders(); 

    t1Folders.users_email = tempUser.email; 
    t1Folders.name = t1Folders.description = "Home"; 

    createFoldersFunction(t1Folders); // assume returns folder ID = 100 

    var t2Folders:Folders = new Folders(); 
    t2Folders.users_email = tempUser.email; 
    t2Folders.name = t2Folders.description = "temp"; 

    createFoldersFunction(t2Folders); // assume returns folder ID = 101 
} 

、ここでは私のイベントハンドラがあり、私がしたい:ここ

<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" 
    // ... 

は、私は新しいユーザー「ホーム」と「TEMP」の2つのデフォルトのフォルダを設定したい私の関連するコードですポップアップ表示するために、それぞれの新しいIDのアラートボックス:

protected function createFoldersFunction(item:Folders):void 
{ 
    createFoldersResult.token = foldersService.createFolders(item); 
} 

protected function createFoldersResult_resultHandler(event:ResultEvent):void 
{ 
    Alert.show("Folder #" + ((event.result as int) as String) + " created"); 
      // Currently, I only get Alert saying "Folder #101 created". 
      // I want to see 2 Alerts - one for #100 and another for #101 

} 

、ここではcallresponderおよびサービスのための私のmxコードです:

<s:CallResponder id="createFoldersResult" 
    result="createFoldersResult_resultHandler(event)"/> 
<foldersservice:FoldersService id="foldersService" 
    fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" 
    showBusyCursor="true"/> 

「101」(2番目のサービスコールの結果)のみがアラートをトリガーしています。どうしてこれなの?

ありがとうございました!

答えて

1

あなたのコードは、createFoldersResultが応答するトークンをオーバーライドしています。適切なコードは次のようになります。

protected function createFoldersFunction(item:Folders):void 
{ 
    var token:AsyncToken = foldersService.createFolders(item); 
    var responder:Responder = new Responder(createFoldersResult_resultHandler, someFaultHandler) 
    token.addResponder(responder); 
} 

別のオプションは、MXMLで直接createFolders用結果ハンドラを設定するので、あなたのfoldersserviceされるだろう:FoldersServiceは次のようになります。

<foldersservice:FoldersService id="foldersService" 
    fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" 
    showBusyCursor="true"> 
    <mx:method name="createFolders" result="createFoldersResult_resultHandler(event)"/> 
</foldersservice:FoldersService> 

、あなたがする必要はありませんcreateFoldersFunctionでは、foldersService.createFoldersを直接呼び出すことができます。

+0

ありがとうございました!あなたの最初のソリューションを使用して、私はIResponderタイプへの暗黙の黙示についてエラーを受け取ります。 IResponderとして「応答者」をキャストした場合、コードが実行されても結果や警告は得られません。 2番目のソリューションを使用すると、Flash Builder 4.5はmx:メソッド(「コンポーネント実装に解決できませんでした」)を認識しません。これらを実行するにはどうすればよいですか? – Tabnaka

+0

最初のケースで適切な輸入をしましたか?レスポンダはIResponderです。もう1つは、mxネームスペースもインポートする必要があります。 –

+0

元の質問にインポートステートメントを追加しました。私は最終的に私のコード内で "Responder"のすべての参照を "mx.rpc.Responder"に明示的に置き換えることによって動作させました。上記のimport文を置くことさえも、flash.net:Responderが使用されているという苦情を私に与えるでしょう。ありがとうございました!! – Tabnaka

関連する問題