2012-01-20 9 views
2

私は現在、Flex 4.5のネットワーキングの部分を学んでいます。私が検討しているコースでは、<s:HTTPService>コンポーネントを使用してサーバに電話をかけたり、独自のカスタムサービスコールを使用して<s:CallResponder>クラスを使用することをお勧めしますデータベース。本当にFlex 4の<s:CallResponder>クラスは何ですか?

コース自体とアドビのドキュメントの両方で、なぜ私がアプローチを取るべきかについて本当に良い説明が見つかりません。誰かがこれが良いアイデアである理由を説明してもらい、それが強く推奨されるケースを提供してもらえますか?

私が使っている簡単な例については、この例を参照してください。私は、<fx:Declarations>タグセットの内部クラスのインスタンスを宣言し、そしてIはfetchData()方法の内側にそれを使用する:応答者が成功に呼び出す関数への参照を含む変数を持つオブジェクトである

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" 
       skinClass="skins.CustomAppSkin"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.controls.Alert; 
      import mx.rpc.events.FaultEvent; 
      import mx.rpc.events.ResultEvent; 

      [Bindable] 
      private var booksCollection:ArrayCollection; 

      private function formatPrice(data:Object, columns:GridColumn):String { 
       return priceFormatter.format(data.price); 
      } 

      protected function fetchData(event:MouseEvent):void { 
       booksResponder.token = books.send(); 
      } 

      protected function processXML(event:ResultEvent):void { 
       this.booksCollection = event.result.catalog.book; 
      } 

      protected function loadHandler(event:FaultEvent):void { 
       Alert.show(event.fault.faultString, event.fault.faultCode); 
      } 
     ]]> 
    </fx:Script> 

    <fx:Declarations> 
     <s:HTTPService id="books" url="data/books.xml"/> 
     <s:CurrencyFormatter id="priceFormatter" currencySymbol="$" fractionalDigits="2" trailingZeros="true" useCurrencySymbol="true"/> 
     <s:CallResponder id="booksResponder" result="processXML(event)" fault="loadHandler(event)"/> 
    </fx:Declarations> 

    <s:Panel id="panel" title="Products" horizontalCenter="0"> 
     <s:DataGrid dataProvider="{booksCollection}" height="400"> 
      <s:columns> 
       <s:ArrayList> 
        <s:GridColumn headerText="Title" width="250" dataField="title"/> 
        <s:GridColumn headerText="Author" dataField="author"/> 
        <s:GridColumn headerText="Genre" width="100" dataField="genre"/> 
        <s:GridColumn headerText="Publish Date" width="100" dataField="publish_date"/> 
        <s:GridColumn headerText="Description" width="400" dataField="description"/> 
        <s:GridColumn headerText="Price (USD)" width="100" dataField="price" labelFunction="formatPrice"/> 
       </s:ArrayList> 
      </s:columns> 
     </s:DataGrid> 

     <s:controlBarContent> 
      <s:Button id="getData" label="Get Data" click="fetchData(event)"/> 
     </s:controlBarContent> 
    </s:Panel> 
</s:Application> 

答えて

0

多分、「歴史的な」背景が役立つかもしれません。 「レスポンダー」という名前は、Flash Player組み込みAPIが通信を処理する方法であるNetConnectionクラスを指します。 NetConnection(一般的なプレーンHTTP接続、メッセージがAMFでエンコードされている場合、またはビデオのダウンロード/ストリーミング(通常RTMP形式の接続)のいずれかによく使用されます)を呼び出します。 ResponderはNetConnectionとともに使用され、HTTP経由のAMFエンコードを使用して通信します。

Responderクラスが組み込まれています。これはNetConnectionで使用され、2つのコールバックへの参照が格納され、通信が成功した場合や通信に失敗した場合に呼び出されます。

上記のスキームは、Flash Playerに存在する他のネットワーキングAPIとは異なります。理由を考えるのは難しいですが、それはAS2以降のようなものです。しかし、AS2では、LoadVarsオブジェクトがあり、フォールトと成功メッセージのコールバックも使用されていました。 XMLクラスも同様に動作します.2つのコールバック関数を作成し、それらをデフォルトのXMLハンドラに割り当てることもできます。レスポンダがAS3より前の設計の根幹であることは不可能ではありません。

アドビ(彼らだけが知っているだけの理由から)は、NetConnection(FlexでRemoteObjectとして知られています)の上に多数の間接レイヤを重ねることに決めたとき、古いデザインの選択肢を保持していました。また、最近のAPIの動作をもっと古風な方法で行いました。したがって、例えばHTTPServiceは、基本的にはURLLoaderであり、RemoteObjectと同じように動作します。これはおそらくMXMLテンプレートで多少役立ちましたが、MXML言語が極限的に制限されていることを知るとすぐに、MXMLレイアウトに特化した機能の相対的メリットは疑問のある複数の設計上の意思決定からなるプラークになります。

Amy:afaik DCD機能(Flash Builderで使用されるサービスのコード生成)はApacheにリリースされていません。これはFlash Builderの一部です。 Adobeがそれを変更しない限り、変更する可能性は低いです。

0

結果が存在し、オプションで、障害が発生した場合に呼び出す関数への参照を持つことができます。いくつかのタイプのレスポンダが設定されていなければ、結果ハンドラとフォルトハンドラを呼び出すことができませんでした。

+0

個人的には、ビューにサービスロジックを入れることを奨励していますが、それは本当に悪いアーキテクチャですが、次のバージョンのFlash Builderはより良い仕事をするでしょう。クリーンなアーキテクチャーは、オープンソースプロジェクトとしてFlexに関わっています。 –

関連する問題