0

selectionChange イベントのリスナーを持つ Spark DataGrid があります。dataGrid をリッスンする関数は、新しく選択された行に、読み込まれたパートナーとは異なる partner_id があるかどうかを確認します。異なる場合は、サーバー (PHP) を呼び出し、指定された ID を持つパートナーを要求します。私の問題は、ユーザーが矢印キーボードを使用して dataGrid をナビゲートする場合、変更が速すぎて、特定の瞬間に呼び出しがパートナー オブジェクトの取得に失敗し、最終的に null になることです (間違ったパートナーを表示するよりはましです) )、しかし、これが起こった後、新しいパートナーが読み込まれないため、私にとってはまだ問題です. 呼び出しを行う前に数ミリ秒待機して、ユーザーが再度変更するか、または他の回避策を実行するかどうかを確認する方法はありますか? ありがとう。

4

2 に答える 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() にリスナーとして 1 つの関数を追加しました。この関数では、処理中のサーバーからの呼び出しがあるかどうかを確認します。存在する場合は、event.preventDefault() を呼び出します。これにより、ユーザーは選択範囲を上下に移動できなくなります。 . サーバーが応答し、ユーザーが選択を再度変更しようとすると、通常どおりに別の呼び出しが行われます。簡単に言えば、選択が変更されるたびにサーバーが呼び出され、グリッドが変更されるのを「ブロック」されます。サーバーが応答すると、グリッドは解放されます。

于 2013-03-01T14:15:17.390 に答える