Apache flex 如何确认Flex actionscript中的文本输入

Apache flex 如何确认Flex actionscript中的文本输入,apache-flex,events,actionscript,Apache Flex,Events,Actionscript,输入数字时,我可以监听哪个TextInput事件来引发警报?场景是:用户在myTxt1中输入一个数字。此时会出现一个警告,提示“您确定要输入该号码吗?”。如果用户单击“是”,则不执行任何操作/继续。如果用户单击“否”,请将焦点放在myTxt1上,以便他可以更改号码 问题是,我不知道该听什么事件来抛出警报。我试过valueCommit和focusOut。对于这两种情况,警报都会显示,但当用户单击“是”时,即使事件是由用户单击myTxt2触发的,焦点仍会保留在myTxt1上。用户试图离开myTxt1

输入数字时,我可以监听哪个TextInput事件来引发警报?场景是:用户在myTxt1中输入一个数字。此时会出现一个警告,提示“您确定要输入该号码吗?”。如果用户单击“是”,则不执行任何操作/继续。如果用户单击“否”,请将焦点放在myTxt1上,以便他可以更改号码

问题是,我不知道该听什么事件来抛出警报。我试过valueCommit和focusOut。对于这两种情况,警报都会显示,但当用户单击“是”时,即使事件是由用户单击myTxt2触发的,焦点仍会保留在myTxt1上。用户试图离开myTxt1,但看到警报,单击“是”,焦点仍在myTxt1上,这是一个恶性循环


这似乎是个简单的问题,但我想不出来。有什么建议吗

> P>如果您试图阻止用户输入数字,否则应考虑使用属性。但是如果您只想通知用户输入号码,您可以使用事件。

< P>如果您试图阻止用户输入号码,或者考虑使用属性。但如果您只想通知用户输入数字,您可以使用event。

在focusOut处理程序中,您必须存储要获取焦点的对象。这是因为当您显示警报时,由于警报窗口现在获得焦点,因此此信息将消失。有关如何正确执行此操作,请参见以下示例。我建议你建立自己的自定义组件,为你做所有的工作

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

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.CloseEvent;
            import mx.managers.FocusManager;

            protected var previousValue:String;
            protected var nextValue:String;
            protected var focusInObject:InteractiveObject;

            protected function isNumber(value:String):Boolean
            {
                // do your check
                return true;
            }

            protected function textInput_focusOutHandler(event:FocusEvent):void
            {
                var value:String = TextInput(event.currentTarget).text;

                if (!isNumber(value) || value == previousValue)
                    return;

                nextValue = value;
                focusInObject = event.relatedObject;
                Alert.show("Are you sure you want to enter that number?", "", Alert.YES | Alert.NO, this, alertCloseHandler);
            }

            protected function alertCloseHandler(event:CloseEvent):void
            {
                if (event.detail == Alert.NO)
                    return;

                previousValue = nextValue;

                if (focusInObject)
                    systemManager.stage.focus = focusInObject;
            }
        ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <s:TextInput focusOut="textInput_focusOutHandler(event)"/>

    <s:CheckBox label="Foo"/>
    <s:Button label="Bar"/>
</s:Application>


我已经包括了一个小优化。如果用户按Yes,应用程序将记住该值。如果您获得另一个focusOut事件,并且自上次以来该值没有更改,则不会显示警报。

在focusOut处理程序中,您必须存储将获得焦点的对象。这是因为当您显示警报时,由于警报窗口现在获得焦点,因此此信息将消失。有关如何正确执行此操作,请参见以下示例。我建议你建立自己的自定义组件,为你做所有的工作

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

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.CloseEvent;
            import mx.managers.FocusManager;

            protected var previousValue:String;
            protected var nextValue:String;
            protected var focusInObject:InteractiveObject;

            protected function isNumber(value:String):Boolean
            {
                // do your check
                return true;
            }

            protected function textInput_focusOutHandler(event:FocusEvent):void
            {
                var value:String = TextInput(event.currentTarget).text;

                if (!isNumber(value) || value == previousValue)
                    return;

                nextValue = value;
                focusInObject = event.relatedObject;
                Alert.show("Are you sure you want to enter that number?", "", Alert.YES | Alert.NO, this, alertCloseHandler);
            }

            protected function alertCloseHandler(event:CloseEvent):void
            {
                if (event.detail == Alert.NO)
                    return;

                previousValue = nextValue;

                if (focusInObject)
                    systemManager.stage.focus = focusInObject;
            }
        ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <s:TextInput focusOut="textInput_focusOutHandler(event)"/>

    <s:CheckBox label="Foo"/>
    <s:Button label="Bar"/>
</s:Application>


我已经包括了一个小优化。如果用户按Yes,应用程序将记住该值。如果您收到另一个focusOut事件,并且该值自上次以来没有更改,则不会显示警报。

如果是TextArea组件,则可以侦听更改事件。如果文本区域中有任何更改,则将触发更改事件。然后,您可以检查按下了哪个键。

如果是TextArea组件,则可以侦听更改事件。如果文本区域中有任何更改,则将触发更改事件。然后,您可以检查按下了哪个键。

谢谢您,格哈德!这正是我正在寻找的解决方案,但是(大但是),我无法使它与我的代码一起工作。我有很多TextInput控件,用户可以通过选项卡或单击来输入一系列数字。当我向代码中添加另一个文本输入,然后在第一个文本输入中输入一个数字,然后单击第二个文本输入时,我在focusOutHandler中遇到了一个问题。我在看“聚焦对象=。。。“行。虽然event.relatedObject看起来不错,但focusInObject被设置为null。似乎将IfocusManager组件接口连接到TextInput时出现问题。您知道解决方法吗?以下是我正在使用的代码(编辑了一点,以便我可以将其作为Flex应用程序运行)很抱歉,我无法粘贴我的代码bc,因为它太长了,但我只是在你的第一个文本输入之后添加了第二个文本输入。啊,我明白了。我没有注意到这个错误,因为它似乎只发生在
mx:TextInput
上。好吧,我已经修改了我的代码示例。我现在存储
事件。relatedObject
而不强制转换,直接用
sy设置焦点stemManager.stage.focus=focusInObject;
谢谢Gerhard!这正是我正在寻找的解决方案,但是(大但是),我无法使其与我的代码一起工作。我有许多TextInput控件,用户可以通过选项卡或单击来输入一系列数字。当我向代码中添加另一个TextInput时,在第一个文本输入中输入一个数字,然后单击第二个文本输入,我在focusOutHandler中遇到了问题。我正在查看“focusInObject=…”行。尽管event.relatedObject看起来不错,但focusInObject设置为null。将iFocusManager组件接口连接到TextInput时似乎出现问题。您知道解决方法吗?这是我正在使用的代码(编辑了一点,以便我可以将其作为Flex应用程序运行)抱歉,我无法粘贴到我的代码中,因为它太长了,但我只是在第一个文本输入之后添加了第二个文本输入。啊,我明白了。我没有注意到这个bug,因为它似乎只发生在
mx:TextInput
上。嗯,我已经修改了我的代码示例。我现在正在存储
事件.relatedObject
而不强制转换,并使用
systemManager.stage.focus=focusInObject直接设置焦点