Frage

Dies ähnelt der gestellten Frage hier. Ich versende benutzerdefinierte Ereignisse "Shopvent", aber ich bekomme einen Fehler "Typ Kecion fehlgeschlagen: Ich kann Flash.Events::egrent@81ecb79 nicht in com.events.shopevent konvertieren"

Hinweis: Der Fehler wird aus der übergeordneten benutzerdefinierten Komponente (3. Code -Snippet) geworfen. Ich habe dort weitere Details hinzugefügt

Dies ist mein individuelles Ereignis. Siehe die erste Konstante, ich kopierte den Ereignisnamen in benutzerdefinierten Komponenten.

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

Benutzerdefinierte Komponente. Überprüfen Sie die Metadaten -Tags. Die Veranstaltung hat korrekt registriert

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

Übergeordnete benutzerdefinierte Komponente. Dies ist die übergeordnete Komponente der obigen benutzerdefinierten Komponente. Es hört auf das Menüs -Ereignis und leitet das Ereignis einfach an die Hörer. Überprüfen Sie die Meatadata -Tags. Die Ereignisregistrierung erfolgt ordnungsgemäß.

Der Fehler kommt jedoch auf

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

Nach meinem Wissen sehe ich kein Problem im Code. Stimmt etwas falsch daran?

Aktualisieren

Überraschenderweise wird, wenn ich eine "neue" Instanz von ShopWent erstelle, das Problem lösen. Aber leider muss ich alle Eigenschaften des Ereignisobjekts schließen. Ich hoffe, dies ist keine Einschränkung von Flex.

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

Vollständiger Code

<?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>
War es hilfreich?

Lösung

Sie müssen Clone () -Methode für benutzerdefinierte Ereignisklassen überschreiben. Ereignisse könnten während der Vermehrung mehrmals geklont werden.

Andere Tipps

Jacks Antwort ist korrekt. Es ist in der Flex -Dokumentation angegeben.

Sie müssen das Ereignis überschreiben.Clone () -Methode in Ihrer Unterklasse. Die Clone () -Methode gibt eine geklonte Kopie des Ereignisobjekts zurück, indem die Typ -Eigenschaft und alle neuen Eigenschaften im Klon festgelegt werden. Normalerweise definieren Sie die Clone () -Methode, um eine mit dem neue Bediener erstellte Ereignisinstanz zurückzugeben.

Für alle Details lesen Arbeiten mit Veranstaltungen unter Erstellen von Unterklassen aus der Veranstaltung Sektion

Ein guter Ort, um die benutzerdefinierten Ereignisse für neue Flex/AS3 -Entwickler zu verstehen Versenden der benutzerdefinierten Ereignisse

HINWEIS: Die Links zeigen auf Flex 4.6 -Dokumentation, aber der benutzerdefinierte Ereignisteil ist nicht versionabhängig (nur MXML -Teil kann für Flex 3 und frühere Versionen unterschiedlich sein)

Sie müssen einen neuen Konstruktor der Ereignisklasse zurückgeben wie:

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

Das clone() Die Methode gibt eine geklonte Kopie des Ereignisobjekts zurück, indem die Typ -Eigenschaft und alle neuen Eigenschaften im Klon festgelegt werden. Normalerweise definieren Sie das clone() Methode zur Rückgabe einer mit dem neuen Bediener erstellten Ereignisinstanz.

Die Veranstaltung, die Sie entsenden, stammt von Typ Flash.Events.event und das Ereignis, für das Ihr Hörer erwartet wird, ist von Typ: com.events.shopvent.

Dies ist einfach die Fehlermeldung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top