Flex 4中的<s:callresponder>类真的是什么?</s:callresponder>

时间:2012-01-20 15:31:23

标签: flash flex flex4 flash-builder httpservice

我正在学习Flex 4.5的网络部分,我正在审查的课程建议我每次使用<s:CallResponder>组件调用服务器时都使用<s:HTTPService>类或者使用我自己的自定义服务调用数据库。

在课程本身和Adobe文档中,我都找不到一个非常好的描述,为什么我应该采用这种方法。有人可以请说明为什么这是一个好主意,并且可能提供一个强烈推荐的案例?

请参阅下面的示例,了解我正在使用它的简单案例。我在<fx:Declarations>标记集内声明了一个类的实例,我在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>

2 个答案:

答案 0 :(得分:0)

响应者是一个对象,其变量包含对成功结果调用的函数的引用,并且可以选择在发生故障时引用要调用的函数。如果您没有设置某种类型的响应者,则无法调用您的结果和错误处理程序。

答案 1 :(得分:0)

也许某些“历史”背景会有所帮助。名称“Responder”指的是NetConnection类的方式,它是Flash播放器内置API处理通信的方式。当您调用NetConnection时(通常用于普通HTTP连接,其中消息在AMF中编码,或用于视频下载/流式传输,这通常是RTMP变体连接)。响应程序与NetConnection一起使用,通过HTTP使用AMF编码进行通信。

有一个内置的Responder类,它与NetConnection一起用于存储对两个回调的引用,这两个回调将在通信成功和通信失败的情况下被调用。

上述方案与Flash播放器中存在的其他网络API不同。很难想出原因,但自AS2以来就是这样。但是,在AS2中,存在LoadVars对象,该对象还使用故障和成功消息的回调。 XML类的行为方式类似 - 您还可以创建两个回调函数并将它们分配给默认的XML处理程序。响应者是AS3前设计的雏形并非不可能。

当Adobe(仅由他们知道的原因)决定在NetConnection(在Flex中称为RemoteObject)上堆积一堆间接层时,他们保留了旧的设计选择。他们还以更古老的方式使更新的API行为。因此,例如,HTTPService,其基本上是伪装的URLLoader,其行为与RemoteObject相同。这可能对MXML模板有所帮助,但只要您意识到MXML语言极为有限,专为MXML布局量身定制的功能的相对优点将成为由多个可疑设计决策组成的牌匾。

Amy:afaik DCD功能(Flash Builder中使用的服务的代码生成)尚未发布到Apache - 它是Flash Builder的一部分。所以,它不太可能改变,除非Adobe自己改变它。