我有几个远程对象方法,我想根据上下文以不同的方式响应,但我宁愿不设置一堆不同的RemoteObject别名。这样做有什么建议吗?一些背景:
假设我有一个管理应用程序,它以不同的方式显示销售统计数据。远程方法如下:
<mx:RemoteObject id="rpt" destination="AMFServer">
<mx:method name="getSalesStats" fault="getSalesStatsFault(event)"
result = "getSalesStatsSuccess(event)" />
</mx:RemoteObject>
getSalesStats方法将员工ID和销售类型作为其参数。你会这样称呼:
rpt.getSalesStats(120, "peanuts");
public function getSalesStatsSuccess(e:ResultEvent):void {
salesdata:ArrayCollection = e.result.rows as ArrayCollection;
salesGraph.dataProvider = salesdata;
salesGraphPanel.title = "Peanut Sales, 1990";
}
我希望能够在不同的上下文中调用此方法,有时将结果发送到图表,有时发送到数据网格;我希望能够根据用户的需要更改图表的标题和类型。我想要的一些东西可以通过评估从服务器返回的数据来实现;该对象包含报告名称,因此我可以评估该值。但有些事情需要改变,而不仅仅是我从服务器回来的东西。如果这是同步通话,那将很容易;我会做类似的事情:
function buttonOneClick():void {
myData1:ArrayCollection = getSalesStats(120, "peanuts");
myChart.dataProvider = myData1;
}
function buttonTwoClick():void {
myData2:ArrayCollection = getSalesStats(120, "cashews");
myDataGrid.dataProvider = myData2;
}
我想通过远程方法将某些内容传递给响应函数,例如:
rpt.getSalesStats(120, "peanuts", "clicked button one");
但当然会抛出错误,因为服务器不需要最后一个参数。有什么想法吗?我会澄清这是否令人困惑......
答案 0 :(得分:2)
Here is a great example of using AsyncToken with RemoteObject method calls准确地完成您的需要。
使用AsyncToken时要记住的一点是,它是一个动态对象,您可以添加任何您想要的属性。响应者方法中的事件将带有对AsyncToken的引用,您可以访问动态属性以轻松识别响应的上下文。
答案 1 :(得分:2)
在Flex 4和3.4中,使用CallResponder类:
<mx:RemoteObject id="rpt" destination="AMFServer"/>
<s:CallResponder id="toChartResponder" fault="getSalesStatsFault(event)"
result = "getSalesStatsToChartSuccess(event)" />
<s:CallResponder id="toDataGridResponder"fault="getSalesStatsFault(event)"
result = "getSalesStatsToDataGridSuccess(event)"/>
要进行调用,请将方法调用中返回的AsyncToken分配给响应者的token属性:
toDataGridResponder.token = rpt.getSalesStats();
这将响应定义与方法调用分开,然后您可以将其包装在您需要的任何逻辑中。
答案 2 :(得分:0)
您可以为remoteObject提供多种方法。
<mx:RemoteObject id="rpt" destination="AMFServer">
<mx:method name="getSalesStatsToChart" fault="getSalesStatsFault(event)"
result = "getSalesStatsToChartSuccess(event)" />
<mx:method name="getSalesStatsToDataGrid" fault="getSalesStatsFault(event)"
result = "getSalesStatsToDataGridSuccess(event)" />
</mx:RemoteObject>
你有什么理由不能使用这样的东西吗?
答案 3 :(得分:0)
Flex支持异步完成令牌设计模式,用于处理对同一服务的多个请求。请参阅BlazeDS documentation。
答案 4 :(得分:0)
我认为只有两种方法可以做到这一点:
如果您无法访问服务器,那是我看到的唯一方式。如果我在你的情况下,我甚至会在每次远程呼叫时创建远程对象。我认为它不会影响性能(如果我错了请纠正我)。祝你好运!
答案 5 :(得分:0)
var rpcCall:AsyncToken;
rpcCall = remoteService.getSessionId();
rpcCall.addResponder(new Responder(handler_getSessionIdSuccess, handler_getSessionIdFault) );
rpcCall = remoteService.getMyData();
rpcCall.addResponder(new Responder(handler_getMyDataSuccess, handlerfault));
remoteobject的“remoteService”实例 希望它有意义。