我有一个带有 selectionChange 事件侦听器的 Spark DataGrid。侦听 dataGrid 的函数检查新选择的行是否具有与加载的伙伴不同的 partner_id。如果不同,它会调用服务器 (PHP) 并请求具有给定 ID 的合作伙伴。我的问题是,如果用户使用箭头键盘在 dataGrid 中导航,则更改发生得太快,并且在某个给定时刻,调用无法检索合作伙伴对象,该对象最终为空(比显示错误的合作伙伴要好),但对我来说仍然是个问题,因为发生这种情况后,永远不会加载新的伙伴。有没有办法在拨打电话之前等待几毫秒,看看用户是否会再次更改它或任何其他解决方法?谢谢。
问问题
479 次
2 回答
2
我建议你尝试另一种方法。您不应避免从服务器加载新信息。您可以加载它并保存以备将来需要。如果您等待来自服务器的响应,这不是一个好方法,因为响应时间可能会有所不同,有时会很长。
因此,我认为您可以通过过滤非常快速的用户操作来尝试忽略新请求。您可以使用计时器来执行此操作。比如说,您将记录之间的最短切换时间定义为 300 毫秒。只需启动一个计时器并等待,它可以停止,直到用户再次更改选择。
下面是一个简单的代码来演示这种方式:
<?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" creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import org.osmf.events.TimeEvent;
import spark.events.GridSelectionEvent;
[Bindable]private var collection:ArrayCollection = new ArrayCollection([
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"},
{field01:"field01", field02:"field02"}
]);
private var delay:Number = 300;
private var timer:Timer = new Timer(delay, 1);
private function init():void
{
timer.addEventListener(TimerEvent.TIMER, onTimer);
}
private function onTimer(event:TimerEvent):void
{
processCurrentSelection();
}
protected function onSelectionChange(event:GridSelectionEvent):void
{
timer.stop();
timer.start();
}
private function processCurrentSelection():void
{
taCurrentIndex.text += dgMain.selectedIndex.toString() + String.fromCharCode(13);
}
]]>
</fx:Script>
<s:HGroup x="10" y="10" height="240">
<s:DataGrid
id="dgMain"
width="300" height="100%"
dataProvider="{collection}"
selectionChange="onSelectionChange(event)">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="field01" headerText="Field 1"/>
<s:GridColumn dataField="field02" headerText="Field 2" width="100"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>
<s:VGroup width="200" height="100%">
<s:Label text="Current Index:"/>
<s:TextArea id="taCurrentIndex" width="100%" height="100%"/>
</s:VGroup>
</s:HGroup>
</s:Application>
于 2013-03-03T17:07:45.663 回答
0
我仍在接受其他解决方案,为我做这项工作的一个可能的解决方案是事件selectionChanging()
与event.preventDefault()
. 我向 selectionChanging() 添加了一个函数作为侦听器,在该函数中我检查是否有来自服务器的调用正在处理,如果有,我调用 event.preventDefault() 不允许用户向下或向上移动选择. 当服务器响应并且用户尝试再次更改选择时,它会正常运行并进行另一个调用。长话短说,每次更改选择时,都会调用服务器并“阻止”更改网格,当服务器响应时,网格会被释放。
于 2013-03-01T14:15:17.390 回答