【问题标题】:Flex 4, multiple instances of a custom component listening the same event of a parentFlex 4,自定义组件的多个实例监听父级的相同事件
【发布时间】:2011-01-28 11:53:39
【问题描述】:

简而言之:

我需要一个自定义组件中的事件侦听器,以便它的所有实例(无需编辑它们)同时反应,由其父容器中的调度事件触发。

详细说明:

  • 我有一个带有选项卡导航器的自定义组件。 (这些选项卡旨在显示不同语言的不同偏好。)

  • 我有一个带有所有语言按钮的按钮栏。

  • 自定义组件的实例很多。

我想单击语言栏的一个按钮并将所有实例切换到同一个选项卡(自定义组件包含更改选项卡的逻辑)。

我可以通过为自定义组件的每个实例添加事件侦听器来做到这一点,因此它会调用一个更改选项卡的内部函数。但是看起来很耦合,不是吗?

不知道是不是可以在组件的master CLASS中完成,所以它监听它的父容器中的事件,不管它是什么。

在我看来,这段代码应该可以工作,但它不能(显然不适合使用自定义事件来传递新的语言值):

this.parent.addEventListener("lang_change", this.change_tab);

这样我可以只删除组件的一个实例,然后看到它自己工作。

提前谢谢你

【问题讨论】:

    标签: apache-flex events multiple-instances


    【解决方案1】:

    我需要一个自定义事件监听器 组件,所以它的所有实例 (不编辑它们)在 同时,由调度的事件触发 在其父容器中。

    根据定义,您想要做的事情就是打破封装。在理想的世界中,组件不应该知道它的父级。如果组件需要与其父级通信,它应该调度一个事件。如果父母需要与孩子沟通,它应该调用该孩子的公共方法(或更改公共属性)。从封装的角度来看,我不建议子级监听父级的事件。

    我想点击 语言栏并获得所有 实例切换到同一个选项卡 (自定义组件包含 更改选项卡的逻辑)。

    所以,然后为按钮添加一个点击处理程序并执行以下操作:

    public function onClick():void{
      myCustomTabNavigator1.selectedIndex = 1 
      myCustomTabNavigator2.selectedIndex = 1 
      myCustomTabNavigator2.selectedIndex = 1 
    }
    

    如果你引用了 selectedItem,你也可以设置它。 , 如果您在数组中有自定义 TabNavigator,则可以循环遍历它们。如果自定义 TabNavigators 是您的自定义组件的子组件,您可以在该自定义组件中创建一个方法来设置默认值并在每个组件上调用该方法,而不是直接设置 selectedIndex。

    【讨论】:

    • 感谢您的回答和封装背景。但是,如果我的自定义组件真的像一个黑匣子一样,当它听到某个东西时做出响应,它不是“更加封装”吗?在我的下一个重构中,我想将主按钮栏隔离在它自己的组件中,因此它不再是组件的父级...
    • @Miguel L. Barco 您的组件确实应该像一个黑盒子。具有一组定义的输入(方法和属性)和一组定义的输出(事件)。组件应该只监听它的子级事件,而不是父级事件。如果一个组件想要对它的孩子做一些事情,它应该通过改变属性或调用方法来做到这一点。监听父母的事件只会破坏封装。
    【解决方案2】:

    【讨论】:

    • -1 因为这个答案似乎丝毫没有解决用户的问题。使用 MVC 框架将如何帮助他解决问题?
    猜你喜欢
    • 2017-02-25
    • 2017-03-23
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2011-12-22
    • 2023-03-07
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多