【问题标题】:Flex executing a function on another viewFlex 在另一个视图上执行功能
【发布时间】:2011-09-08 20:19:59
【问题描述】:

我有一个 headerbar.mxml,当用户在我的应用程序中 swipes_down 时显示。 headerbar.mxml 包含一个按钮组件,我想在主应用程序窗口中运行 erase()。主应用程序是一个绘图应用程序,其中包含一个erase()。我只是不知道如何从另一个 mxml 视图文件中调用函数。我认为它会类似于 click="{mainwindow.drawPanel.erase()}";

编辑:

protected function onColorChange(event:List):void{
                appHome.drawArea.erase();
            }

【问题讨论】:

    标签: apache-flex components swipe


    【解决方案1】:

    在另一个视图中运行一个功能(AKA 组件)这在很大程度上取决于架构。听起来你想在你的父母中运行一个函数。在这种情况下,“适当封装”方法是从 component1 调度事件;在组件 1 的父级中侦听事件;并从事件监听器执行函数。

    因此,在标题栏的父级中的某处,添加事件侦听器:

    headerbarInstance.addEventListener('parentDoSomething', onHeaderBarToldMeTo);
    

    如果是 ActionSCript 3 组件,我可能会在构造函数中添加它,如果是 MXML 组件,我可能会在预初始化事件处理程序中添加它。 “父”组件也需要监听函数:

    protected function onHeaderBarToldMeTo(event:Event):void{
      erase();
    }
    

    当点击 headerbar.mxml 中的按钮组件并触发 headerbar 内的点击事件处理程序时,需要调度事件,如下所示:

    protected function onButtonInheaderbarClick(Event:Event):void{
     dispatchEvent(new Event('parentDoSomething'));
    }
    

    一切都应该神奇地工作。如果函数不在父级的直接子级中,您可能必须冒泡事件。

    如果你不关心封装,你也可以直接访问父级。所以你的标题栏组件会这样做:

    parent.erase();
    

    它简单明了,应该可以工作,但从维护的角度来看,这被认为是非常糟糕的做法。

    【讨论】:

    • 谢谢,如果我只是在另一个视图中引用一个函数,我现在明白该怎么做,但是我忘了提到的是,erase() 在我的 main 实例化的 drawArea 对象中应用视图。所以我需要在我的另一个视图中对对象运行 erase()。请看我的编辑。这就是我现在想要做的。
    • @Casey Wylde 如果 'erase()' 是视图子视图的公共方法;然后一旦事件冒泡;而不是擦除做“myChild.erase()”。我说的其他一切都是正确的。
    • 您也可以使用 FlexGlobals.topLevelApplication 访问顶级应用程序并调用该函数;但从封装的角度来看,它也被认为是不好的,因为它为您的组件提供了外部依赖。
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2021-11-04
    相关资源
    最近更新 更多