Actionscript 3 如何取消Halo/Spark TextInput和TextArea组件中的编辑

Actionscript 3 如何取消Halo/Spark TextInput和TextArea组件中的编辑,actionscript-3,textarea,flex4,textinput,flex-spark,Actionscript 3,Textarea,Flex4,Textinput,Flex Spark,我使用的是Flex4,ActionScript3 在AdvancedDataGrid组件中,当您在单元格中处于编辑模式时,可以按Escape键取消编辑(即返回到单元格中的上一个值) 在Halo和Spark TextInput和TextArea组件中,在编辑模式下,我预期会出现相同的行为,但惊讶地发现情况并非如此 我查看了所有四个组件的属性,看看这是否是我需要配置的东西,但找不到任何东西 这是需要编码的东西吗?是的,这是需要编码的东西。以下是我将采取的方法: 创建扩展TextInput的自定义组件

我使用的是Flex4,ActionScript3

在AdvancedDataGrid组件中,当您在单元格中处于编辑模式时,可以按Escape键取消编辑(即返回到单元格中的上一个值)

在Halo和Spark TextInput和TextArea组件中,在编辑模式下,我预期会出现相同的行为,但惊讶地发现情况并非如此

我查看了所有四个组件的属性,看看这是否是我需要配置的东西,但找不到任何东西


这是需要编码的东西吗?

是的,这是需要编码的东西。以下是我将采取的方法:

  • 创建扩展TextInput的自定义组件。让我们称之为
    UndoTextInput
  • 向UndoTextInput添加新变量以存储TextInput的原始文本。我们将其称为
    originalText
  • 聚焦事件中添加事件侦听器。在
    focusIn
    事件处理程序中,将当前文本值存储在
    originalText
    变量中
  • focusOut
    事件上添加事件。在
    focusOut
    事件中,将
    originalText
    的值设置回空字符串
  • keyDown
    事件上添加事件侦听器。在事件侦听器中,检查是否按下了Escape(
    键盘.Escape
    )键。如果是,请将文本重置回原始文本中存储的内容
  • 我希望这有帮助

    更新:

    下面是一个关于如何使用Actionscript类执行此操作的快速示例。可以根据需要随意修改

    package
    {
        import flash.events.FocusEvent;
        import flash.events.KeyboardEvent;
        import flash.ui.Keyboard;
    
        import spark.components.TextInput;
    
        public class UndoTextInput extends TextInput
        {
            private var originalText:String = "";
    
            public function UndoTextInput()
            {
                super();
                this.addEventListener(FocusEvent.FOCUS_IN, focusInEventHandler);
                this.addEventListener(FocusEvent.FOCUS_OUT, focusOutEventHandler);
                this.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyPress);
            }
    
            protected function focusOutEventHandler(event:FocusEvent):void
            {
                this.originalText = "";
            }
    
            protected function focusInEventHandler(event:FocusEvent):void
            {
                this.originalText = this.text;
            }
    
            protected function checkKeyPress(event:KeyboardEvent):void
            {
                if (event.keyCode == Keyboard.ESCAPE)
                {
                    event.stopImmediatePropagation();
                    this.text = this.originalText;
                }
            }
        }
    }
    

    嗨,杰森,谢谢你的及时回复。我只是想知道创建一个单独组件的好处。我改变了您的解决方案,仍然使用常规TextArea,创建了一个全局变量originalText,并在常规TextArea上设置focusIn/focusOut/keyUp侦听器。我知道拥有自定义组件有助于重用,这是我需要的,但是自定义组件中捕获的唯一组件是originalText变量吗?这意味着我还需要在使用自定义组件的每个mxml中定义focusIn/focusOut/keyUp吗?我希望你能理解我的问题。Bon@bon_t如果您创建了一个扩展TextArea组件的自定义组件,并添加了该组件所需的所有变量、EventListener等,那么您就不必在组件外部再次声明它们。如果您想在
    数据组
    中继器
    中使用自定义组件,或者只想在一个页面上有多个自定义组件,那么您还需要使用自定义组件。如果需要在组件上声明其他focusIn、focusOut等EventListener(例如,用于验证),则可以在mxml中声明包含该组件的那些。我希望这是有道理的您好,Jason,我是在创建一个以TextArea作为超类的ActionScript类,还是在创建一个mxml组件?谢谢你的耐心。嗨,杰森,是的,我会接受你的回答。我第一次开始做ActionScript类,但我不知道如何将focusIn、focusOut和keyUp放在那里。它们是公共方法吗?所以我现在使用的是mxml组件b/c,我知道如何定义这些属性。您能告诉我如何为AS类执行此操作吗?@bon\t我添加了一个关于如何使用Actionscript类执行此操作的快速示例。我希望有帮助!