我正在尝试理解Flex框架中的事件传播,并对此有疑问:
场景:我在DropDownList
上有一个内置组件change
,我想在其中创建一个自定义事件refreshPreview
,并希望将其传播到自定义组件PictureComponent
。
在自定义组件的mxml中,我添加了Metadata指令,如下所示,用编译器注册refreshPreview
事件
<fx:Metadata>
[Event(name="refreshPreview", type="flash.events.Event")]
</fx:Metadata>
布局详细信息:在我的主要mxml应用程序中,我已经列出了DropDownList
和自定义组件,这两个组件都是兄弟姐妹(即有一个共同的间接父级)
例如
<s:Group id="contentGroup">
<s:Group id="formGroup">
<s:Form x="11"
y="86">
<s:FormItem label="Employee:">
<!-- Built-in component -->
<s:DropDownList id="dropDownList"
dataProvider="{employeesCollection}"
labelField="LASTNAME">
</s:DropDownList>
</s:FormItem>
</s:Form>
</s:Group>
<s:Group id="pictureGroup">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<!-- Custom Component -->
<p:PictureComponent x="360"
y="2"
employee="{new Employee(dropDownList.selectedItem.ID,firstName.text, lastName.text)}"
refreshPreview="picturecomponent1_refreshPreviewHandler(event)">
</p:PictureComponent>
</s:Group>
</s:Group>
此外,我在createComplete事件上调用的init()方法中的内置组件中添加了事件侦听器:
// Initializes this component
private function init():void
{
//add event listeners for dropDownList
dropDownList.addEventListener(IndexChangeEvent.CHANGE, employeeChangeEventHandler);
}
这是处理内置组件事件和准备自定义事件并调度它的事件处理程序:
private function employeeChangeEventHandler(event:IndexChangeEvent):void
{
var eventObject:Event=new Event("refreshPreview");
dispatchEvent(eventObject);
}
我发现refreshPreview
事件未传播到自定义组件。
我怀疑这是因为内置组件是目标的兄弟(生成事件的地方)而不是父级。如果是这个原因,请您帮助我了解如何将refreshPreview
事件传播到自定义组件?
答案 0 :(得分:0)
在DropDownList MXML中,添加:
<s:change>
dispatchEvent(new Event('refreshPreview', true));//true allows it to bubble out of your View
</s:change>
请注意,字符串不是事件类常量之一的Flash事件不自定义事件。它是具有不同类型参数的Flash事件。自定义事件将编写您自己的事件类,您不需要这样做。
请注意,shaunhusain是正确的...你有这种结构的方式,PictureComponent不会响应父视图中的事件,但本身。我不会养成在兄弟视图上调度事件的习惯。相反,我让父View在PictureComponent上设置了一些属性,或者将PictureComponent中的属性绑定到dropDownList中的选定项。