我有几个,我想在根据上下文不同的方式来响应远程对象的方法,但我宁愿没有设置很多不同的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";
}
我希望能够调用在不同环境下这种方法,有时将结果发送到一个图表,有时一个DataGrid; 我希望能够更改标题,并根据用户想要什么样的图表类型。 有些什么,我想可以通过评估从服务器返回的数据来实现; 对象包含报表的名字,所以我可以评估值。 但有些事情需要基于不仅仅是我所得到的从服务器返回更多的改变。 如果这是一个同步调用,它会很容易; 我会做一些事情,如:
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");
但当然,抛出一个错误,因为服务器不想要的最后一个参数。 有什么想法吗? 我要澄清,如果这是令人困惑的..
下面是使用的AsyncToken与RemoteObject的方法的一个很好的例子调用做正是你所需要的。
事情要记住,当你正在使用的AsyncToken是,它是一个动态的对象,你可以添加你想要的任何财产。 在您的应答方法,本次活动将进行到AsyncToken的引用,您可以访问您的动态性能可以轻松地识别响应的上下文。
在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:
toDataGridResponder.token = rpt.getSalesStats();
这种分离的方法调用的响应定义,然后你可以用它在任何你需要的逻辑。
你可以有多种方法来一个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>
是否有任何理由,为什么你不能使用这样的事情?
Flex支持用于处理多个请求对同一服务的异步完成标记的设计模式。 请参阅BlazeDS的文档 。
我认为,只有两种方法可以做到这一点:
- 具有用于每个呼叫上下文独立的远程对象。 对性能的影响是不容忽视的IMO。
- 设置为并发该RemoteObject单(或第一,不知道名字,但不是多个或最后一个),并有某种标志,你可以用它来判断哪些是所谓的最后一个方法。 这将,当然,限制服务器在此远程对象的时候调用一个。 如果前面的调用没有返回结果尚未调用将立即失败。
这是我看到的唯一途径,如果你有对服务器的访问权限。 如果我是你的情况,我会甚至创建远程对象每次我做远程调用的时间。 我不认为这会影响性能(请纠正我,如果我错了)。 祝好运!
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”实例。