Actionscript 3 使用Spark Datagrid selectionChange和键盘阵列

Actionscript 3 使用Spark Datagrid selectionChange和键盘阵列,actionscript-3,datagrid,event-handling,flex4,selectionchanged,Actionscript 3,Datagrid,Event Handling,Flex4,Selectionchanged,我有一个Spark DataGrid,带有一个selectionChange事件的侦听器。侦听dataGrid的函数将检查新选定的行是否与加载的伙伴具有不同的伙伴id。如果不同,它会调用服务器(PHP)并请求具有给定id的合作伙伴。我的问题是,如果用户使用箭头键盘在dataGrid中导航,则更改发生得太快,并且在某个给定时刻,调用无法检索合作伙伴对象,结果为null(比显示错误的合作伙伴更好),但对我来说仍然是个问题,因为在这种情况发生后,新的合作伙伴永远不会被加载。有没有一种方法可以在打电话之

我有一个Spark DataGrid,带有一个selectionChange事件的侦听器。侦听dataGrid的函数将检查新选定的行是否与加载的伙伴具有不同的伙伴id。如果不同,它会调用服务器(PHP)并请求具有给定id的合作伙伴。我的问题是,如果用户使用箭头键盘在dataGrid中导航,则更改发生得太快,并且在某个给定时刻,调用无法检索合作伙伴对象,结果为null(比显示错误的合作伙伴更好),但对我来说仍然是个问题,因为在这种情况发生后,新的合作伙伴永远不会被加载。有没有一种方法可以在打电话之前等待几毫秒,看看用户是否会再次更改它或其他解决方法?谢谢。

我仍在接受其他解决方案,一个可能的解决方案是事件
selectionChanging()
以及
event.preventDefault()
。我在selectionChange()中添加了一个函数作为侦听器,在该函数中,我检查是否有来自进程中服务器的调用,如果有,我调用event.preventDefault(),它不允许用户向下或向上移动选择。当服务器响应并且用户再次尝试更改选择时,它将正常运行并进行另一次调用。长话短说,每次更改选择时,都会调用服务器并“阻止”网格进行更改,当服务器响应时,网格将被释放。

我建议您尝试另一种方法。您不应该避免从服务器加载新信息。您可以加载它并保存以备将来需要。如果等待服务器的响应,这不是一个好方法,因为响应时间可能不同,有时相当长

所以我认为你可以通过过滤用户的快速行为来忽略新的请求。你可以用定时器来做这件事。例如,您将记录之间的最短切换定义为300ms。只需启动一个计时器并等待,或者它可以停止,直到用户再次更改选择

下面是一个简单的代码来演示这种方法:

<?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>