【问题标题】:Flex: Accessing functions / components accross mxml pagesFlex:跨 mxml 页面访问功能/组件
【发布时间】:2008-10-09 15:24:29
【问题描述】:

为简单起见,假设我有两个 flex mxml 页面。

form.mxml
按钮.mxml

如果 form.mxml 页面有以下代码,它应该可以正常工作:

<custom:SelectView dSource="{_thedata}" id="form" visible="false">
</custom:SelectView>

<mx:LinkButton label="Show" id="lbShow" click="form.visible=true;>
<mx:LinkButton label="Show" id="lbHide" click="form.visible=false;>

但如果代码是这样的:

form.mxml

 <custom:SelectView dSource="{_thedata}" id="form" visible="false">
 </custom:SelectView>

button.mxml

<mx:LinkButton label="Show" id="lbShow" click="form.visible=true;>
<mx:LinkButton label="Show" id="lbHide" click="form.visible=false;>

如何从 button.mxml 调用来更改 form.mxml

----更多细节---

我的页面实际上是这样的: where query:AdvancedSearchFields 基本上是在页面中包含一个弹性表单,我希望它在搜索完成后显示/隐藏下面的自定义视图。

<query:AdvancedSearchFields searchType="projects" searchCategory="advanced" visible="true" id="AdvancedSearch" />

<custom:SelectView dSource="{_searchResults}" id="sv" visible="false">

【问题讨论】:

    标签: apache-flex mxml


    【解决方案1】:

    您可以编写一个自定义方法来处理按钮单击事件并引发自定义事件。然后在 form.mxml 中你可以处理那个事件。

    像这样拆分它更简洁一些,因为它使 button.mxml 文件独立工作。让 Button.mxml 直接引用您的表单会导致两者之间的紧耦合,通常您应该避免紧耦合。

    编辑:我刚刚有了另一个想法,它也避免了紧耦合并且更简单:

    form.mxml

    <custom:SelectView dSource="{_thedata}" id="form" visible="{buttons.showForm}">
    </custom:SelectView>
    
    <!-- include your buttons.mxml component using an ID of "buttons" -->
    

    buttons.mxml

    <mx:Script>
    <![CDATA[
        [Bindable] public var showForm:Boolean = true;
    ]]>
    </mx:Script>
    
    <mx:LinkButton label="Show" id="lbShow" click="this.showForm=true;">
    <mx:LinkButton label="Hide" id="lbHide" click="this.showForm=false;">
    

    这实质上是通过使用变量绑定来模拟使用自定义事件。每当按钮中的 showForm 变量更改时,SelectView 的可见属性将通过绑定进行更新。这比创建自定义事件更轻量级(尽管我认为自定义事件的设计要好一些)。

    【讨论】:

    • 虽然我的回答可行,但这个解决方案更干净(耦合更少)。干得好。
    • 嘿,你的回答给了我绑定解决方案的想法,所以它很有帮助。 :)
    【解决方案2】:

    您的button.mxml 类必须引用将受到影响的“表单”类的实例。然后就可以直接对其进行操作了:

    Button.mxml:

    <mx:Script>
    <![CDATA[
        [Bindable] public var myForm:MyFormClass;
    ]]>
    </mx:Script>
    
    <mx:LinkButton label="Show" id="lbShow" click="myForm.form.visible=true;">
    <mx:LinkButton label="Show" id="lbHide" click="myForm.form.visible=false;">
    

    通常,设置此变量最合乎逻辑的位置是在 Button 类的父级中。

    【讨论】:

    • 这会在表单和按钮组件之间创建紧密耦合。他们每个人都直接引用另一个人,这通常是个坏主意。
    【解决方案3】:

    如果您需要更频繁地处理这个问题,我建议您使用像 PureMVC 这样的 MVC 框架。它的设置是为了让您拥有一个 Mediator 对象,该对象侦听来自 MXML 组件的事件,然后发送一个通知,该通知可以被任何其他调解器拾取。然后该中介可以根据通知及其相关数据来操作自己的可视化组件。

    在您正在做的事情(简单版本)的上下文中,您可以接受基本解决方案。但是,一旦你处理四五个或更多具有大量逻辑的组件,你就不会高兴了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多