我刚开始弯曲,如果这是一个愚蠢的问题,请原谅我。
现在我正在使用自定义事件将数据从一个组件传递到另一个组件。我的问题是事件只会冒泡。如何将数据传递给不是调度事件的组件的父组件?
这是基本布局。我正在尝试将组件1中的数据传递给组件3。
Application MXML
Component 1
Component 2
Component 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)