Flex - распространение события из встроенного компонента в пользовательское событие - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь понять распространение событий в среде Flex и у меня есть следующие сомнения по этому поводу:

Сценарий: У меня есть встроенный компонент DropDownList на change, из которого я хочу создать пользовательское событие refreshPreview и хочу распространить его на пользовательский компонент PictureComponent.

В mxml пользовательского компонента я добавил следующую директиву метаданных, чтобы зарегистрировать событие 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>

Также я добавил обработчики событий для встроенного компонента в методе init (), который вызывается при событии creationComplete:

    // 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 голосов
/ 27 января 2012

Внутри вашего 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...