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

我正在使用 Flex 4、ActionScript 3。

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

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

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

这是需要编码的东西吗?

【问题讨论】:

    标签: actionscript-3 textarea flex4 textinput flex-spark


    【解决方案1】:

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

    1. 创建一个扩展 TextInput 的自定义组件。我们就叫它UndoTextInput吧。
    2. 在 UndoTextInput 中添加一个新变量来存储 TextInput 的原始文本。我们称之为originalText
    3. focusIn 事件上添加事件侦听器。在focusIn 事件处理程序中,将当前文本值存储在originalText 变量中。
    4. focusOut 事件上添加一个事件。在focusOut 事件中,将originalText 的值设置回空字符串。
    5. 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 类执行此操作。希望对你有帮助!
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2021-12-20
    • 2012-10-14
    相关资源
    最近更新 更多