Событие отправки из ItemRenderer в группу данных - PullRequest
1 голос
/ 28 апреля 2011

Eventdispatching здесь мы снова ...

Я пытаюсь отправить пользовательское событие из пользовательского ItemRenderer внутри группы данных, но безуспешно.

// CUSTOM EVENT
import flash.events.Event;

public class CategoryEvent extends mx.events.MenuEvent
{
    public static const UPDATE:String   = "UPDATE_CATEGORY";
    public var categoryId:Number;

    public function CategoryEvent(type:String, categoryId:Number)   
    {
        this.categoryId = categoryId;
        super(type, true, false);
    }

    override public function clone():Event
    {
        return new CategoryEvent(type, categoryId);
    }
}

 // Main Class

<s:Application  xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:mx="library://ns.adobe.com/flex/mx" 
                creationComplete="init()">

    <fx:Script>
            <![CDATA[
            // All my imports here 

            private function init():void
            {   
                this.addEventListener(CategoryEvent.UPDATE, updateCategories);
                this.tree.addEventListener(CategoryEvent.UPDATE, updateCategories);
            }

            private function updateCategories(event:CategoryEvent):void
            {
                //IS NEVER CALLED - DONT KNOW Y
            }
            ]]>
    </fx:Script>

    <s:DataGroup id="tree" dataProvider="{this.getCategorysChildrenResult.lastResult}" itemRenderer="components.Category"></s:DataGroup>

// Custom Item Renderer
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" >
    <fx:Script>
        <![CDATA[
            import ...events.CategoryEvent;
            import ...valueObjects.Category;
            import flash.events.EventDispatcher;


            protected function update(id:Number):void
            {

                var categoryEvent:CategoryEvent = new CategoryEvent("UPDATE", data.id);
                // tried all variations...
                dispatchEvent(categoryEvent);
                owner.dispatchEvent(categoryEvent);
                parent.dispatchEvent(categoryEvent);
                parentApplication.dispatchEvent(categoryEvent);

            }


        ]]>
    </fx:Script>

    <s:Group>
        <s:BorderContainer>
            <mx:Text buttonMode="true" text="{data.name}"  />
            <s:BorderContainer click="{this.update(data.id)}" buttonMode="true" />
        </s:BorderContainer>
    </s:Group>
</s:ItemRenderer>

Из того, что я увидел в отладчике, события отправляются из ItemRenderer, но они никогда не отлавливаются слушателем (обработчик слушателя никогда не вызывается).Многие предложения обсуждаются по этому поводу в stackoverflow, но большинство для более старых версий flex или не практично для моего сценария.Кто-нибудь может помочь?

1 Ответ

4 голосов
/ 28 апреля 2011

Во-первых, ваше мероприятие должно быть расширено Event, а не MenuEvent.

После этого все довольно просто.В диспетчере вы используете строку ('UPDATE'), но в своем слушателе вы используете статическую константу UPDATE, которая равна 'UPDATE_CATEGORY'.

Просто измените это:

var categoryEvent:CategoryEvent = new CategoryEvent("UPDATE", data.id);

к этому:

var categoryEvent:CategoryEvent = new CategoryEvent(CategoryEvent.UPDATE, data.id);
...