如何取消 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 组件的自定义组件并添加该组件所需的所有变量、事件监听器等,那么您不必在组件外再次声明它们。如果您想在DataGroup
、Repeater
中使用自定义组件,或者只想在一个页面上拥有多个组件,您还需要使用自定义组件。如果您需要在组件上声明 other focusIn、focusOut 等 eventListeners(例如用于验证),那么是的,您可以在具有该组件的 mxml 中声明它们。我希望这是有道理的。 :)
嗨 Jason,我是在创建一个以 TextArea 作为超类的 ActionScript 类,还是在创建一个 mxml 组件?感谢您的耐心等待。
嗨,杰森,是的,我会接受你的回答。我刚开始做ActionScript 类,但我不知道如何将focusIn、focusOut、keyUp 放在那里。它们是公共方法吗?那么我现在正在使用 mxml 组件 b/c 我知道如何定义这些属性。你能告诉我如何为 AS 课做这件事吗?
@bon_t 我添加了一个快速示例,说明如何使用 Actionscript 类执行此操作。希望对你有帮助!以上是关于如何取消 Halo/Spark TextInput 和 TextArea 组件中的编辑的主要内容,如果未能解决你的问题,请参考以下文章
React-native中多个textInput键盘不能收回的问题的原因分析及解决办法