【发布时间】:2010-11-02 18:52:30
【问题描述】:
我不确定在尝试通过用户交互对表单“做某事”时最佳做法是什么 - 如果这是最佳做法,我当然愿意接受替代方案。
有一个名为“enter”的 MXML 事件属性适用于 s:TextInput,当用户在 TextInput 字段中按下 Enter 键时调用 AS 事件处理程序(想象一下 Search 字段 - 您输入搜索词并按 Enter )。
现在,在该事件处理程序中,我需要获取父 Form 对象。因为我们在这里讨论的是最佳实践,所以我对通过 ID 引用表单不感兴趣,以防我的“输入”处理程序必须能够处理不同的表单。
我的问题是 - 在 Flex 中处理事件目标的父表单的最佳方式是什么? Flex 中的父子层次结构绝对可笑(例如:FileSyncFB0.WindowedApplicationSkin2.Group3.contentGroup.TabNavigator7.NavigatorContent10.SkinnableContainerSkin11.contentGroup.Group17.Panel18.PanelSkin23._PanelSkin_Group1.contents.contentGroup.directoryForm_A.FormSkin32.contentGroup.FormItem34.FormItemSkin36 .contentGroup)。
说真的。
谁能明白这一点?
在上面的乱码链中,我正在寻找的对象恰好是 directoryForm_A 但看看它是多么嵌套!肯定有一个 FormItem 的某些属性引用它的父窗体?
The MXML structure is much more meaningful semantically:
<s:Form id="directoryForm_A" width="100%">
<s:FormItem width="100%" label="URI">
<s:layout>
<s:BasicLayout/>
</s:layout>
<s:helpContent>
<s:Label text="Help String"></s:Label>
</s:helpContent>
<s:TextInput left="0" right="0" enter="handleUserSetRootDirectory(event)"/>
</s:FormItem>
</s:Form>
TextInput 正在启动事件,并且是 event.target。按照我的 MXML 层次结构,逻辑链可能是 event.target.parent.parent,将我从 TextInput 带到 FormItem 再到 Form,但正如您所见,可爱的可换肤 Spark 架构将所有其他显示对象和容器置于中间。
是否有一些其他层次结构我可以利用,这些层次结构具有更语义纯的结构来遍历?或者是否有一个内置的 FormItems 属性或方法(至少)允许您访问它们的逻辑父容器?
或者我是否仍然像 Flash/AS3 开发人员那样思考太多,而我应该只穿上我的牛仔裤并采用不同的范例?
【问题讨论】:
-
顺便说一句,虽然 Robusto 的答案是真正的 McCoy,但我一直在寻找的东西——比 DisplayObject 链更结构化的层次结构——可以通过 UIComponent.owner 找到。所以要做我想做的事(这不是最佳实践),你会说 event.target.owner.owner。
标签: apache-flex forms mxml parent hierarchy