【问题标题】:What Really is the <s:CallResponder> Class in Flex 4?Flex 4 中的 <s:CallResponder> 类到底是什么?
【发布时间】:2012-02-15 03:50:13
【问题描述】:

我现在正在学习 Flex 4.5 的网络部分,我正在复习的课程建议我在调用服务器时使用 &lt;s:CallResponder&gt; 类,无论是使用 &lt;s:HTTPService&gt; 组件还是我自己的组件对数据库的自定义服务调用。

无论是在课程本身还是在 Adob​​e 文档中,我都找不到一个很好的描述来说明为什么我应该采用这种方法。有人可以描述一下为什么这是一个好主意,或者提供一个强烈推荐的案例吗?

请参阅下面的示例,了解我使用它的简单案例。我在&lt;fx:Declarations&gt; 标签集中声明了一个类的实例,并在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>

【问题讨论】:

    标签: flash apache-flex flex4 flash-builder httpservice


    【解决方案1】:

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

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

    上述方案与 Flash 播放器中存在的其他网络 API 不同。很难去想原因,但从 AS2 开始就是这样。然而,在 AS2 中,有 LoadVars 对象,它也使用回调来获取错误和成功消息。 XML 类的行为方式类似——您还将创建两个回调函数并将它们分配给默认的 XML 处理程序。响应器是 AS3 之前设计的雏形并非不可能。

    当 Adob​​e(出于只有他们自己知道的原因)决定在 NetConnection(在 Flex 中称为 RemoteObject)之上堆积一堆间接层时,他们保留了旧的设计选择。他们还使最近的 API 以更古老的方式运行。因此,例如,HTTPService,基本上是伪装的URLLoader,其行为方式与 RemoteObject 相同。这可能对 MXML 模板有所帮助,但是一旦您意识到 MXML 语言的局限性很大,专为 MXML 布局量身定制的功能的相对优点就会变成由多个有问题的设计决策组成的牌匾。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我个人认为,自动生成会鼓励你将服务逻辑放在 View 中,这是非常糟糕的架构,但也许下一个版本的 Flash Builder 会做得更好,现在人们对干净架构有更深入理解的人更多地参与了 Flex 作为一个开源项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2010-11-15
      • 2014-04-11
      • 2018-01-19
      • 2010-09-17
      • 1970-01-01
      • 2019-03-03
      相关资源
      最近更新 更多