Question

Ceci est similaire à la question posée . Je dispatching événement personnalisé "ShopEvent" mais je reçois l'erreur "Type Coercion a échoué: ne peut pas convertir flash.events::Event@81ecb79 à com.events.ShopEvent"

Remarque: L'erreur est lancée à partir du composant personnalisé parent (3ème extrait de code), j'ai ajouté plus de détails il y a

Ceci est mon événement personnalisé. Voir la première constante, je copie le nom collé de l'événement dans les composants personnalisés.

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);
        }
    }
}

composant personnalisé. Vérifiez les balises de métadonnées. L'événement correctement enregistré

<?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>

Composant parent personnalisé. C'est composant parent du composant ci-dessus personnalisé. Il écoute l'événement menuSelected et il simplement achemine l'événement aux listeneres. Vérifiez les étiquettes meatadata. Enregistrement de l'événement est bien fait.

Cependant, l'erreur vient à

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

avec ma connaissance, je ne vois aucun problème dans le code. Y at-il quoi que ce soit mauvais en elle?

Mise à jour

Étonnamment, si je crée une instance de shopwevent « nouveau » va résoudre le problème, mais malheureusement, je dois fermer toutes les propriétés de l'objet événement . J'espère que ce n'est pas une limitation de flexion.

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

Code complet

<?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>
Était-ce utile?

La solution

Vous devez remplacer la méthode clone () pour les classes d'événements personnalisés. Événements pourraient être clonés à plusieurs reprises lors de la propagation.

Autres conseils

La réponse de Jack est correcte. Il est donné dans la documentation flex.

Vous êtes tenu de remplacer la méthode Event.clone () dans votre sous-classe. La méthode clone () retourne une copie clonée de l'objet d'événement en définissant la propriété de type et de nouvelles propriétés dans le clone. En règle générale, vous définissez la méthode clone () pour renvoyer une instance d'événement créé avec le nouvel opérateur.

Pour plus de détails lire de travail avec des événements dans création de sous-classe de la section événement

Un bon endroit pour comprendre les événements personnalisés pour les nouveaux développeurs Flex / AS3 lire Liquider le événements personnalisés

Note: les liens pointent vers Flex 4.6 documentation, mais la personne à charge une partie des événements personnalisés ne sont pas la version (seule une partie MXML peut être différent pour Flex 3 et versions antérieures)

vous devez retourner nouveau constructeur de la classe d'événements comme:

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

La méthode clone() retourne une copie clonée de l'objet d'événement en définissant la propriété de type et de nouvelles propriétés dans le clone. En règle générale, vous définissez la méthode clone() pour renvoyer une instance d'événement créé avec le nouvel opérateur.

L'événement vous dispatching est à partir du type flash.events.Event et l'événement que votre auditeur attend pour est à partir du type:. Com.events.ShopEvent

Ceci est simplement ce que les moyens de message d'erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top