【问题标题】:Pass data between flex components在弹性组件之间传递数据
【发布时间】:2009-05-08 18:29:42
【问题描述】:

我是 flex 新手,如果这是一个愚蠢的问题,请原谅我。

现在我正在使用自定义事件将数据从一个组件传递到另一个组件。我的问题是事件只会冒泡。如何将数据传递给不是调度事件组件的父级的组件?

这是基本布局。我正在尝试将组件 1 中的数据传递给组件 3。

Application MXML
     Component 1
     Component 2
          Component 3

【问题讨论】:

    标签: apache-flex actionscript-3 flex3


    【解决方案1】:

    如果图/树中的所有组件都需要一条数据,最好的办法是在每个组件上公开一个公共的可绑定属性。让子组件调度一个由父组件处理的冒泡事件,父组件可以设置可绑定属性的新值。如果您将属性从父级绑定到子级,这将“级联”到其他组件。

    <!-- in root application -->
    <Component1 myData="{myData}"/>
    

    如果您需要调用额外的逻辑,您可以定义一个 get/set 对而不是 public var 并将逻辑添加到 setter:

    [Bindable] private var _myData;
    public function set myData(value:Object):void
    {
        _myData = value;
        doSomeLogic();
    }
    

    更好的是使用 Flex 的失效框架来优化性能:

    _myDataChanged : Boolean = false;
    [Bindable] private var _myData;
    public function set myData(value:Object):void
    {
        if (_myData != value) {
            _myData = value;
            _myDataChanged = true;
        }
        invalidateProperties();
    }
    
    override protected function commitProperties() : void {
        super.commitProperties();
        if (_myDataChanged) {
            _myDataChanged = false;
            doSomeLogic()
        }
    }
    

    这种模式在构成 Flex 框架的所有 UIComponents 中到处都使用。您可能还需要覆盖 updateDisplayList(...) 来定位元素。

    【讨论】:

    • 啊,这就是我需要的。我也喜欢那个失效框架。
    【解决方案2】:

    最简单的方法就是访问其他组件。

    <Component1 name="component1/>
    
    <Component2 name="component2" onClick="onClickHandler()"/>
    
    private function onClickHandler(event:MouseEvent):void
    {
        component1.property1 = "Random data";
        component1.sendData("Random Data");
    }
    

    当你在component1中设置一个可绑定的公共属性时,它会引发一个PropertyChangedEvent,你也可以处理它。

    您在这里有很多选择,看看哪一个最适合您正在尝试做的事情。

    编辑:进一步阅读我认为您正在尝试做的事情,您正在尝试从组件 2 访问组件 3,但组件 3 对组件 1 不可见?不过,它仍然应该可以通过 component2 访问(组件往往是公共成员)。

    private function component1OnClickHandler(event:MouseEvent):void
    {
         component2.component3.property1 = "Random data";
    }
    

    希望这会有所帮助!

    【讨论】:

    • 这似乎对我有用。如果我从组件 1 内的组件中分派一个偶数,在应用程序 MXML 中捕获它,然后在组件 3 中设置数据,这是一个坏主意吗?它有效,但似乎不是最好的做事方式。
    • 没关系,看来绑定数据是我想要的解决方案
    【解决方案3】:

    我最近遇到了这个问题!! 所以这就是我如何克服它,以防有人在 5 年后需要它;-)

    这个link非常解决问题。


    • 创建一个自定义事件类,其中包含要作为该类成员传递的所需数据(如 here 所示)。
    • 从 Component1 调度一个自定义事件

      dispatchEvent(new CustomEvent("customEvent",myData));
      
    • 在 Component2 中创建一个以 myData 作为参数的方法
    • 在父Component中添加EventListener,调用Component2中的方法传递event.myData

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2018-02-15
      • 2020-08-08
      • 2020-03-05
      • 1970-01-01
      • 2017-08-12
      • 2022-01-20
      • 2019-01-04
      相关资源
      最近更新 更多