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

Posted

技术标签:

【中文标题】如何取消 Halo/Spark TextInput 和 TextArea 组件中的编辑【英文标题】:How to cancel editing in Halo/Spark TextInput and TextArea components 【发布时间】:2011-09-07 03:03:46 【问题描述】:

我正在使用 Flex 4、ActionScript 3。

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

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

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

这是需要编码的东西吗?

【问题讨论】:

【参考方案1】:

是的,这是必须编码的东西。这是我将采取的方法:

    创建一个扩展 TextInput 的自定义组件。我们就叫它UndoTextInput吧。 在 UndoTextInput 中添加一个新变量来存储 TextInput 的原始文本。我们称之为originalText。 在focusIn 事件上添加事件侦听器。在focusIn 事件处理程序中,将当前文本值存储在originalText 变量中。 在focusOut 事件上添加一个事件。在focusOut 事件中,将originalText 的值设置回空字符串。 在keyDown 事件上添加事件侦听器。在事件侦听器中,检查是否按下了 Escape (Keyboard.ESCAPE) 键。如果是,请将文本重置为存储在 originalText 中的内容。

我希望这会有所帮助!

更新:

这是一个关于如何使用 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_t 如果您创建一个扩展 TextArea 组件的自定义组件并添加该组件所需的所有变量、事件监听器等,那么您不必在组件外再次声明它们。如果您想在DataGroupRepeater 中使用自定义组件,或者只想在一个页面上拥有多个组件,您还需要使用自定义组件。如果您需要在组件上声明 other focusIn、focusOut 等 eventListeners(例如用于验证),那么是的,您可以在具有该组件的 mxml 中声明它们。我希望这是有道理的。 :) 嗨 Jason,我是在创建一个以 TextArea 作为超类的 ActionScript 类,还是在创建一个 mxml 组件?感谢您的耐心等待。 嗨,杰森,是的,我会接受你的回答。我刚开始做ActionScript 类,但我不知道如何将focusIn、focusOut、keyUp 放在那里。它们是公共方法吗?那么我现在正在使用 mxml 组件 b/c 我知道如何定义这些属性。你能告诉我如何为 AS 课做这件事吗? @bon_t 我添加了一个快速示例,说明如何使用 Actionscript 类执行此操作。希望对你有帮助!

以上是关于如何取消 Halo/Spark TextInput 和 TextArea 组件中的编辑的主要内容,如果未能解决你的问题,请参考以下文章

承诺等待后取消 lodash debounce

键盘输入事件被 TextInput 窃听?

带有TextInput和按钮的Flex警报

React-native中多个textInput键盘不能收回的问题的原因分析及解决办法

yii2 如何获取 textInput 值并发送到另一个 textInput

如何使用单个处理程序处理多个 TextInput?