在flex组件之间传递数据

时间:2009-05-08 18:29:43

标签: flex actionscript-3 flex3

我刚开始弯曲,如果这是一个愚蠢的问题,请原谅我。

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

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

Application MXML
     Component 1
     Component 2
          Component 3

3 个答案:

答案 0 :(得分:10)

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

<!-- 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(...)来定位元素。

答案 1 :(得分: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,你也可以处理它。

你在这里有很多选择,看看哪一个最适合你想要做的事情。

编辑:进一步阅读我认为你想要做的事情,你试图从component2访问component3,但component3对component1来说是不可见的?它仍然可以通过component2访问,(组件往往是公共成员)。

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

希望这有帮助!

答案 2 :(得分:0)

我最近遇到过这个问题!! 所以这就是我如何克服它,以防任何人需要它5年下线; - )

link解决了这个问题。


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

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