我不确定在尝试使用用户互动的形式“做某事”时最佳做法是什么 - 如果这是最好的做法,我肯定会接受替代方案。
有一个名为“enter”的MXML事件属性适用于s:TextInput,当用户在TextInput字段中按下Enter键时调用AS事件处理程序(想象一下搜索字段 - 您在搜索字词中键入并按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,但正如你所看到的,可爱的skinnable Spark架构将所有这些其他显示对象和容器放在中间。 / p>
是否有一些我可以利用的其他层次结构具有更加语义纯粹的结构来遍历?或者是否有一个内置的FormItems属性或方法(至少)允许您访问其逻辑父容器?
或者我仍然像Flash / AS3开发人员那样思考太多,并且我应该采用不同的范例来采用我的牛仔裤?
答案 0 :(得分:2)
您不应该尝试引用event.target.parent.parent
。永远不要试图建立这样的参考链,因为它可能会改变,当你改变它时它会破坏它。相反,为TextInput提供一个处理ENTER事件的处理程序,并调度由event.target.parent.parent
引用的任何内容监听的另一个(可能是自定义的)事件,无论是表单,容器还是应用程序本身。如有必要,请举办活动泡泡会。然后在 处理程序中执行任何操作。
答案 1 :(得分:0)
永远不要试图建立参与 链
为什么不呢?你必须巧妙地做到这一点:-)
如果你知道父母的ID或它的类类型,你总是可以通过显示链浏览以获得你正在寻找的确切父对象。请查看this以获取示例。
海报的问题: 我用火花碰到了好几次。我认为,通常你应该尝试避免孩子依赖于父母的情况。如果您发现自己陷入了迫切需要获取父级引用的情况,则应该在创建对象时将其与子构造函数一起传递(现在这是干净的方式 - 理论上)。另一种方式(如上所述)是向上走过显示列表。如果你静态地(parent.parent.parent)这是危险的。上面的链接包含一个示例,显示如何使用简单的递归函数解决问题。