为什么Alert.show()会给我两个警告框?

时间:2012-06-15 14:18:01

标签: flex

当我在一个Alert.show的函数中使用DataGridEvent时,我有一种奇怪的行为。

执行Alert.show时,该功能运行两次。

这是代码:

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 个答案:

答案 0 :(得分:2)

我怀疑将警报与itemEditEnd事件结合使用是有问题的。写了一个简单的测试用例,其表现不同(我似乎进入了无限循环)。

问题在于:

  1. 可以通过多种方式调度itemEditEnd事件:键盘交互(在编辑单元格时按Tab键或按Enter键),鼠标交互等等。

  2. 我开始编辑单元格。然后我点击tab / enter或点击另一个单元格。这会生成itemEditEnd事件会将焦点移至新的可编辑单元格。

  3. itemEditEnd事件的事件处理程序中,显示Alert。此弹出窗口会从该可编辑单元格中移除焦点...从而调度第二个itemEditEnd事件。

  4. 在我下面的测试应用中,我实际上创建了一个无限循环。

    如果您需要在itemEditEnd事件后显示警告,也许您可​​以在事件处理程序中放置一些逻辑(因此它会在第二次立即返回)。

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

答案 1 :(得分:0)

我通过在第一次触发警报时将布尔值设置为true来解决问题,然后如果用户尝试更改onter行中的其他项目,则在点击处理程序中将其设置为false。

请求帮助;)