2

Alert.showを取る関数で使用すると、奇妙な動作が発生しDataGridEventます。

Alert.show実行されると、関数は 2 回実行されます。

これはコードです:

private function onItemEnd(event:DataGridEvent):void
{

    var pattern:RegExp =/[^a-z0-9A-ZéèçàêïôëËÉÊÈìíîïÌÍÎÏÇùúûü]/;
    var res:Boolean=pattern.test(texteSaisi);
    if(res==true){
        event.reason = DataGridEventReason.CANCELLED; 
        Alert.show("Le nom de l'option ne doit pas contenir des caractère spéciaux."); 
    }else{ 
        if (event.dataField == "libelle"){
            question.libelle = texteSaisi;
        }else if (event.dataField == "description") {
            question.description = texteSaisi;
        }

<mx:DataGrid 
    draggableColumns="false" 
    dataProvider = "{model.obtenirListeOptionsTarificationProposition}" 
    id = "gridOptions"
    rowCount = "10" 
    doubleClickEnabled = "true"
    itemClick = "onItemClick(event)" 
    change = "onChange(event)"
    width = "80%" 
    editable = "true"
    itemEditEnd = "onItemEnd(event)">

この関数が呼び出されると、画面に 2 つのアラートが表示されますが、その理由はわかりません。

4

2 に答える 2

2

itemEditEndイベントと組み合わせてアラートを使用することには問題があるのではないかと思いました。動作が異なる単純なテスト ケースを作成しました (私の場合は無限ループに入るようです)。

問題はこれです:

  1. イベントは、itemEditEndさまざまな方法でディスパッチできます: キーボード操作 (セルの編集中にタブまたは Enter キーを押す)、マウス操作など。

  2. セルの編集を開始します。次に、Tab/Enter を押すか、別のセルをクリックします。itemEditEndこれにより、イベントが生成され、フォーカスが新しい編集可能なセルに移動します

  3. イベントのイベント ハンドラーにはitemEditEndAlertが表示されます。このポップアップは、その編集可能なセルからフォーカスを外します ... したがって、2 番目のitemEditEndイベントが送出されます。

以下のテスト アプリでは、実際に無限ループを作成しました。

イベントの後にアラートを表示する必要がある場合itemEditEndは、イベント ハンドラーに何らかのロジックを入れることができます (2 回目はすぐに返されます)。

<?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="onCreationComplete()">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;

            private function onCreationComplete():void
            {
                grid.dataProvider=createCollection();
            }


            private function createCollection():ArrayCollection
            {
                var tmp:Array = [];
                for (var i:int = 1; i<11; i++)
                {
                    tmp.push({ data: Math.random()*100, label: i.toString() + " label" });
                }
                return new ArrayCollection(tmp);
            }

            private function onItemEditEnd():void
            {
                Alert.show("item edit end");
            }

        ]]>
    </fx:Script>

    <mx:DataGrid id="grid" itemEditEnd="onItemEditEnd()" editable="true" />

</s:Application>
于 2012-06-15T21:47:50.397 に答える
0

アラートが初めて発生したときにブール値をtrueに設定して問題を修正し、ユーザーが1行目の別のアイテムを変更しようとした場合、クリック時のハンドラーでfalseに設定しました。

助けてくれてありがとう;)

于 2012-06-18T13:34:13.983 に答える