Flex - 将事件从内置组件传播到自定义事件

时间:2012-01-27 15:52:57

标签: flex event-handling

我正在尝试理解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事件传播到自定义组件?

1 个答案:

答案 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中的选定项。