Frage

Mein Problem ist also, dass der SelectedIndex nicht aktualisiert wird, wenn ich NextSlide () und PrewSlide () verwende, die ausgeführt werden, wenn ich auf zwei Schaltflächen klicke. SelectedIndex funktioniert, wenn ich auf die Elemente in der Liste klicke. Was mache ich falsch? Muss ich einige Ereignisse entsenden? Gibt es irgendwelche Tricks, um es mit Tasten zu machen?

Dies ist meine Playlist -Klasse

public class Playlist extends List
        {
            private var dispatcher:Dispatcher;

            public function Playlist()
            {
                super();

                this.dragEnabled = true;
                this.dragMoveEnabled = true;
                this.dropEnabled = true;
                this.allowMultipleSelection = true;   
                this.dispatcher = new Dispatcher();
            }

            public function handleSelection(event:PlaylistEvent):void
            {
                if (event.type == PlaylistEvent.ITEMS_SELECTED){
                    selectItem(event.index, event.count);
                    selectedIndex = event.index;
                }
            }

            private function selectItem(index:Number, count:Number):void
            {
                var tempArray:Array = this.dataProvider.toArray();
                var indiceVector:Vector.<int> = new Vector.<int>();
            var itemVector:Vector.<Object> = new Vector.<Object>();
            var n:int = 1;
            for (var i:int=0;i<tempArray.length;i++){
                var item:PlaylistItem = tempArray[i];
                if (i<index) deselectItem(item);
                else if (i<index+count) {
                    item.Selected=true;
                    indiceVector[count-n] = i;
                    itemVector[count-n++] = item;

                }
                else deselectItem(item);
            }
            selectedItems = itemVector;
            selectedIndices = indiceVector;
        }

        private function deselectItem(item:PlaylistItem):void
        {
            item.Selected = false;
        }


        public function nextSlide():void
        {
            if (dataProvider.length == 0) return;
            var index:int = selectedIndex;

            if (index < 0) {
                var event1:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, 0, 1);
                dispatcher.dispatchEvent(event1);
                return;
            }

            var item:PlaylistItem = PlaylistItem(dataProvider.getItemAt(index));
            if (index < dataProvider.length-1) {
                trace("going to index", index+1);
                var event:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, index+1, 1);
                dispatcher.dispatchEvent(event);
                return;
            }
        }

        public function previousSlide():void
        {
            if (dataProvider.length == 0) return;
            var index:int = selectedIndex;
            if (index < 0) {
                var event1:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, 0, 1);
                dispatcher.dispatchEvent(event1);
                return;
            }

            var item:PlaylistItem = PlaylistItem(dataProvider.getItemAt(index));
            if (index > 0) {
                var event:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, index-1, 1);
                dispatcher.dispatchEvent(event);
                return;
            }
        }
    }
}

Dies ist mein Mate EventMap

<?xml version="1.0" encoding="utf-8"?>
<mate:EventMap xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:mate="http://mate.asfusion.com/"
               xmlns:air="de.websector.mate.extensions.air.*">
    <fx:Script>
        <![CDATA[

            import components.Playlist;
            import events.PlaylistEvent;
            import mx.controls.Alert;
            import mx.events.*;
            import mx.logging.*;
            import mx.logging.Log;
            import spark.components.Application;

            private var logger:ILogger;     
            private function initLogger():void{
                logger = Log.getLogger("MainEventMap");
                trace("started init maineventmap");
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <mate:EventHandlers type="{FlexEvent.APPLICATION_COMPLETE}">
            <mate:InlineInvoker method="initLogger"/>
            <mate:ObjectBuilder generator="{MainManager}"/>
            <mate:EventAnnouncer type="{InitEvent.SYSTEM_INIT_COMPLETE}" />
        </mate:EventHandlers>
        <mate:Injectors target="{Playlist}">
            <mate:PropertyInjector targetKey="dataProvider" source="{MainManager}" sourceKey="playlistItems" />
        </mate:Injectors>
        <mate:Injectors target="{MainManager}">
            <mate:PropertyInjector targetKey="playlist" source="{Playlist}" />
        </mate:Injectors>

        <!-- Playlist events! __________________________________________________________________________________________________-->

        <mate:EventHandlers type="{PlaylistEvent.ITEMS_SELECTED}">
            <mate:MethodInvoker generator="{Playlist}" method="handleSelection" arguments="{event}" />
        </mate:EventHandlers>


    </fx:Declarations>

</mate:EventMap>
War es hilfreich?

Lösung

Mate kann Ihre private Dispatcher -Variable mit einem Verweis auf seinen Eventbus nicht bevölkern, sodass die Event -Karte das Ereignis, das Sie darauf entsenden, nie "hört" und Ihre Methode nicht aufrufen kann.

Dies scheint eine dumme Art zu sein, eine Methode auf derselben Komponente aufzurufen, und ich denke, dies ist ein Zeichen dafür, dass Sie die Logik in irgendeiner Weise trennen sollten. Was ich vorschlagen würde, ist, dass Sie ein Präsentationsmodell haben, das den Dataprovider und SelectedIndex enthält und darauf einen Hinweis darauf injizieren. Anschließend wird Ihre Liste an den DataProvider und SelectedIndex gebunden. Der PM kann auf Ereignisse im Bus anhören, um SelectedIndex zu pflegen, oder Sie können ihn direkt über die Ansichtskomponente bedienen.

Wenn Sie feststellen, dass es ein bisschen problematisch ist, eine Listenunterklasse mit Schaltflächen zu haben, können Sie die neue Gruppenunterklasse mit einer Liste und Schaltflächen ohne Probleme anschließen.

Für ein Beispiel für die ordnungsgemäße Injektion des Ereignisbus http://www.developria.com/2010/05/refactoring-with-mate.html. Es sieht so aus, als hätten Sie einen guten Start beim Verständnis des Eventbus http://www.developria.com/2010/05/pass-the-eventdispatcher-peas.html .

Andere Tipps

Wie jemand auf #flex (irc: //irc.freenode.net/flex) betonte, wird der Fehler verwendet MethodInvoker Wenn es eine neue Instanz der Klasse erstellt und dann die Handelsauswahlmethode auf dieser Instanz ausführt. Ich habe dieses Problem gelöst, indem ich die Instanz der Wiedergabeliste in die EventMap injizierte und verwendete InlineInvoker.

<mate:EventHandlers type="{PlaylistEvent.ITEMS_SELECTED}">
        <mate:InlineInvoker method="{playlist.handleSelection}" arguments="{event}" />
    </mate:EventHandlers>

Das Problem war also bei der Verwendung des Mate -Frameworks, nicht in Flex oder Datenbank oder EventDispatching.

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