Domanda

Questo è simile alla domanda posta qui . Sto dispacciamento evento personalizzato "ShopEvent", ma sto ottenendo errore "Tipo di coercizione non riuscita: impossibile convertire flash.events::Event@81ecb79 a com.events.ShopEvent"

Nota: errore viene generato dalla componente principale personalizzato (3 ° frammento di codice), ho aggiunto ulteriori dettagli vi

Questa è la mia evento personalizzato. Vedere la prima costante, copio incollato il nome dell'evento in componenti personalizzati.

package com.events
{
    import flash.events.Event;

    public class ShopEvent extends Event
    {

        public static var MENU_SELECTED:String = "menuSelected";
        public static var SUBMENU_SELECTED:String = "submenuSelected";
        public static var ITEM_SELECTED:String = "itemSelected";
        public static var NAV_NEXT:String = "navNext";
        public static var NAV_PREVIOUS:String = "navPrevious";
        public static var NAV_LAST:String = "navLast";
        public static var NAV_FIRST:String = "navFirst";
        public static var CLOSE:String = "close";

        public var menuIdx:int;
        //public var menuType:String;
        public var menuId:int;
        public var menuName:String;
        public var itemId:int;
        public function ShopEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
        }
    }
}
componente

Personalizza. Controllare i tag di metadati. L'evento registrato correttamente

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" width="72" height="82"
         mouseChildren="false"
         creationComplete="init()"
         click="onClick()"
         buttonMode="true">
    <s:layout>
        <s:VerticalLayout horizontalAlign="center"/>
    </s:layout>
    <fx:Script>
        <![CDATA[
            import com.events.ShopEvent;

            import mx.controls.Image;
            public var menuId:int;

            [Bindable]
            public var menuText:String;
            [Bindable]
            public var bmp:Bitmap;

            private function init():void{
                //img.addChild(bmp);
            }
            private function onClick():void{
                var e:ShopEvent = new ShopEvent(ShopEvent.MENU_SELECTED);
                e.menuId = menuId;
                e.menuName = menuText;
                dispatchEvent(e);
            }

        ]]>

    </fx:Script>
    <fx:Metadata>
        [Event(name="menuSelected", type="com.events.ShopEvent")]
    </fx:Metadata>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Label text="{menuText}" fontWeight="bold" fontSize="12" width="44"/>
    <mx:Image id = "img" width="57" height="47" source="{bmp}"/>

</s:Group>

componente personalizzato Parent. Questo è componente principale del componente personalizzato sopra. Si ascolta l'evento menuSelected ed esso semplicemente percorsi l'evento al listeneres. Controllare i tag meatadata. registrazione dell'evento è fatto correttamente.

Tuttavia, l'errore sta venendo a

           menus[i].addEventListener( ShopEvent.MENU_SELECTED,function(e:ShopEvent):void{dispatchEvent(e);});

con la mia conoscenza, non vedo alcun problema nel codice. C'è qualcosa di sbagliato in esso?

Aggiorna

A sorpresa, se creo un'istanza "nuovo" di shopwevent risolverà il problema, ma purtroppo, ho bisogno di chiudere tutte le proprietà dell'oggetto evento . Spero che questa non è una limitazione di flex.

                menus[i].addEventListener( ShopEvent.MENU_SELECTED,function(e:ShopEvent):void{dispatchEvent(new ShopEvent(ShopEvent.MENU_SELECTED));});

completo del codice

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"
         width="720" height="605"
         creationComplete="init()" xmlns:shop="UI.shop.*" xmlns:hasu="UI.shop.hasu.*"
         >
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Metadata>
        [Event(name="navNext", type="com.events.ShopEvent")]
        [Event(name="navPrevious", type="com.events.ShopEvent")]
        [Event(name="menuSelected", type="com.events.ShopEvent")]
        [Event(name="submenuSelected", type="com.events.ShopEvent")]
        [Event(name="itemSelected", type="com.events.ShopEvent")]
        [Event(name="close", type="com.events.ShopEvent")]
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import com.events.ShopEvent;

            private const MAX_SLOTS:int = 6;

            public var menus:Vector.<ShopMenuItemView>;
            public var itemSlots:Vector.<ShopItemSlotView> = new Vector.<ShopItemSlotView>(MAX_SLOTS);

            private function init():void{
                trace("BEGIN:UI.shop.hasu.ShopView.init");
                initSlots();
            }

            private function initSlots():void{

                for (var i:int = 0;i<itemSlots.length;i++){
                     var slot:ShopItemSlotView = new ShopItemSlotView();
                    itemSlots[i] = slot; 
                    itemSlotsContainer.addElement(slot);
                }
            }

            public function initMenus():void{
                trace("BEGIN:UI.shop.hasu.ShopView.initMenus");
                for (var i:int = 0;i < menus.length;i++){
                    menuContainer.addElement(menus[i]);
                    menus[i].addEventListener(ShopEvent.MENU_SELECTED,function(e:ShopEvent):void{dispatchEvent(e);});
                    //menus[i].addEventListener( ShopEvent.MENU_SELECTED,function(e:ShopEvent):void{dispatchEvent(new ShopEvent(ShopEvent.MENU_SELECTED));});
                }
            }



        ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout />
    </s:layout>
    <s:VGroup name="top">
        <hasu:ShopPlayerAttributesView id="attribsComp"/>
        <s:Group id="menuContainer" name="menus">
            <s:layout>
                <s:HorizontalLayout />
            </s:layout>
        </s:Group>
    </s:VGroup>
    <s:Group>
        <s:layout>
            <s:HorizontalLayout />
        </s:layout>
        <s:Button label="&lt;" />
        <s:Group id = "itemSlotsContainer" name="items">
            <s:layout>
                <s:TileLayout requestedColumnCount="3" requestedRowCount="3"/>
            </s:layout>
        </s:Group>
        <s:Button label="&gt;" />
    </s:Group>
</s:Group>
È stato utile?

Soluzione

Metodo

È necessario sovrascrivere clone () per le classi di eventi personalizzati. Eventi potrebbero essere clonate più volte durante la propagazione.

Altri suggerimenti

La risposta di Jack è corretta. Si è dato nella documentazione flex.

Si sono tenuti a eseguire l'override del metodo Event.clone () nella vostra sottoclasse. Il metodo clone () restituisce una copia clonata dell'oggetto evento impostando la proprietà tipo e di eventuali nuove proprietà nel clone. In genere, si definisce il metodo clone () per restituire un'istanza evento creata con l'operatore new.

Per maggiori dettagli leggere di lavoro con gli eventi sotto la creazione sottoclasse dalla sezione dell'evento

Un buon posto per capire gli eventi personalizzati per i nuovi sviluppatori Flex / AS3 per leggere Dispacciamento gli eventi personalizzati

Nota: i link puntano a Flex 4.6 documentazione, ma la parte eventi personalizzati non è la versione dipendente (solo una parte MXML può differente per Flex 3 e le versioni precedenti)

si deve restituire nuova costruttore della classe evento come:

return new ShopEvent(type,...); //in the clone() method;

Il metodo clone() restituisce una copia clonata dell'oggetto evento impostando la proprietà tipo e di eventuali nuove proprietà nel clone. In genere, si definisce il metodo clone() per restituire un'istanza manifestazione nata con l'operatore new.

L'evento che è dispacciamento dal tipo flash.events.Event e l'evento che il vostro ascoltatore si aspetta per è da tipo:. Com.events.ShopEvent

Questo è semplicemente ciò che il mezzo messaggio di errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top