Question

Donc mon problème est le selectedIndex est pas mis à jour quand j'utilise nextSlide () et prevSlide (), qui sont exécutés lorsque je clique sur deux boutons. SelectedIndex fonctionne quand je clique sur les éléments dans la liste. Qu'est-ce que je fais mal? Dois-je envoyer des événements? Y a-t-il des trucs à faire avec des boutons?

Ceci est ma classe playlist

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

Ceci est mon eventmap mate

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

La solution

Mate est pas en mesure de remplir votre variable répartiteur privée avec une référence à son bus d'événements, de sorte que la carte de l'événement jamais « Entend » l'événement que vous dispatching sur elle, et ne peut invoquer votre méthode.

Cela semble être une façon stupide d'invoquer une méthode sur le même composant, et je pense que cela est un signe que vous savez que vous devez faire de distinction entre la logique. Ce que je vous suggère est que vous avez un modèle de présentation qui contient le dataprovider et selectedIndex, et introduire une référence à cela. Ensuite, votre liste va se lier à la dataprovider et selectedIndex. L'h peut écouter les événements sur le bus pour maintenir selectedIndex, ou vous pouvez utiliser directement à partir du composant View.

De cette façon, lorsque vous vous rendez compte qu'il est un problème de bits pour une sous-classe de liste qui a des boutons en elle, vous pouvez joindre la nouvelle sous-classe de groupe qui a une liste et boutons sans aucun problème.

Pour un exemple de la façon de bien injecter le bus de l'événement (qui montre commodément comment utiliser un PM), consultez http://www.developria.com/2010/05/refactoring-with-mate.html . On dirait que vous avez un bon départ sur la compréhension du bus d'événements, mais vous voudrez peut-être obtenir un peu plus de détails en regardant http://www.developria.com/2010/05/pass-the-eventdispatcher-pleas.html .

Autres conseils

Comme quelqu'un l'a sur #Flex (irc: //irc.freenode.net/flex), l'erreur utilise MethodInvoker comme il construit une nouvelle instance de la classe, puis en exécutant le procédé de handleSelection sur ladite instance. J'ai résolu ce problème en injectant l'instance de playlist dans le eventmap et en utilisant InlineInvoker .

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

Le problème était donc dans l'utilisation du cadre de compagnon, pas dans Flex ou databinding ou eventdispatching.

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