0

У меня есть Spark DataGrid с прослушивателем selectChange. Функция, которая прослушивает dataGrid, проверяет, имеет ли новая выбранная строка другое партнерское_ид из загруженного партнера. Если он отличается, он вызывает сервер (PHP) и запрашивает партнера с данным идентификатором. Моя проблема заключается в том, что если пользователь использует клавиатуру со стрелками для перемещения по DataGrid, изменения происходят слишком быстро, и в какой-то данный момент вызов не может получить объект-партнер, который заканчивается как null (лучше, чем показывать неверного партнера), но все же проблема для меня, потому что после этого новый партнер никогда не загружается. Есть ли способ подождать пару миллисекунд, прежде чем совершать вызов, чтобы узнать, изменит ли пользователь его снова или какую-либо другую работу? Благодарю.Работа с Spark Datagrid selectionChange и Keyboard Array

ответ

0

Я по-прежнему принимаю другие решения, возможно, для меня это событие selectionChanging(), а также event.preventDefault(). Я добавил одну функцию в качестве слушателя в 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> 
Смежные вопросы