0

我有一个Spark DataGrid与侦听器selectionChange事件。侦听dataGrid的函数检查新选择的行是否与加载的伙伴有不同的partner_id。如果它不同,它会调用服务器(PHP)并要求具有给定ID的合作伙伴。我的问题是,如果用户使用箭头键盘浏览数据网格,则更改发生得太快,并且在某些特定时刻,调用无法检索合作伙伴对象,该对象最终为空(好于显示错误的合作伙伴),但对我来说仍是一个问题,因为在发生这种情况之后,一个新的合作伙伴永远不会被加载。在打电话之前是否有办法等待几毫秒,以查看用户是否会再次更改或执行其他工作?谢谢。使用火花Datagrid selectionChange和键盘阵列

回答

0

我仍然接受其他解决方案,一个可能的解决方案是selectionChanging()event.preventDefault()。我添加了一个函数作为listener到selectionChanging(),在这个函数中我检查是否有来自正在处理的服务器的调用,如果有,我调用event.preventDefault(),它不允许用户将选择向下或向上移动。当服务器响应并且用户试图再次改变选择时,它正常进行并且发出另一个呼叫。长话短说,每当选择被改变,服务器被调用并且网格被“阻塞”以被改变,当服务器响应时,网格被设置为空闲。

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>