【问题标题】:Flex+MXML: Getting parent form from textfield "enter" eventFlex+MXML:从文本字段“输入”事件中获取父表单
【发布时间】: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


【解决方案1】:

您不应该尝试引用event.target.parent.parent。永远不要试图建立这样的参考链,因为它很可能会改变,而当你改变它时,它会破坏事情。相反,为您的 TextInput 提供一个处理程序,该处理程序处理 ENTER 事件并调度另一个(可能是自定义的)事件,该事件由 event.target.parent.parent 所指的任何对象(无论是表单、容器还是应用程序本身)监听。如有必要,请设置活动气泡。然后在 that 处理程序中做任何你想做的事情。

【讨论】:

  • 谢谢。你是绝对正确的。当我处理这个问题时,我意识到这种方法在视图(文本字段及其父链)和控制器(点击处理程序)之间创建了过于紧密的耦合。正如您所指出的,Flex 实际上可以通过 Subject-Observer 模型轻松避免这种情况,例如由 [Bindable] 数据结构实现的模型,或者按照您的建议,使用自定义事件。
【解决方案2】:

永远不要尝试建立参考 链

为什么不呢?你只需要巧妙地做到这一点:-)

如果您知道父对象的 ID 或它的类类型,您可以随时浏览显示链以获取您正在寻找的确切父对象。以this 为例。

对于发帖人的问题: 我用火花遇到了很多次。我认为,通常你应该尽量避免孩子依赖父母的情况。如果您发现自己陷入了迫切需要获取父级引用的情况,您应该在创建对象时将它与子级的构造函数一起传递(现在这是干净的方式 - 理论上)。另一种方式(如上所述)是向上浏览显示列表。如果你静态地这样做(parent.parent.parent),这很危险。上面的链接包含一个示例,说明如何使用简单的递归函数解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2016-05-15
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多