Domanda

L'UX proposto che sto cercando di raggiungere è questo:

    .
  1. UTENTE FACCULTA Voce di menu (tramite una sottoclasse Listbase: E.G. Buttonbar o Tabbar)
  2. Prevenire la selezione iniziale
  3. Convalida se l'utente ha bisogno di risolvere i problemi (ad esempio dati non salvati su un modulo, ecc.)
  4. Se valido, prendere la selezione e impostare la Base di List in quella selezionataNedex, altrimenti presenti avvertenze all'utente e annullare il processo di selezione del tutto
  5. Questo non funziona come ti aspetteresti. Utilizzando il tipo IndexChangeevent.Changing e il prevelgefault funziona per uccidere la selezione, ma al punto 4, quando sto impostando programmaticamente il codice selezionato del listbase, quindi tenta di ripetere il rifugio l'evento che cambia (questo nonostante ciò che afferma il Documento API). < / P >.

    Ecco un codice SRC dell'applicazione di esempio se desideri provare questo per te stesso. Attendo con ansia i tuoi commenti e soluzioni.

    Grazie. J

    http://snipt.org/vuji3#expand

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application minWidth="955" minHeight="600"
               xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx"
               xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Script>
        <![CDATA[
            import flash.utils.setTimeout;
    
            import mx.core.mx_internal;
    
            import spark.events.IndexChangeEvent;
    
            use namespace mx_internal;
    
            [Bindable]
            private var doPreventDefault:Boolean;
    
            [Bindable]
            private var delayMS:uint = 500;
    
            private function buttonbar_changingHandler( event:IndexChangeEvent ):void
            {
                // TODO Auto-generated method stub
                if ( doPreventDefault )
                {
                    event.preventDefault();
    
                    setTimeout( delayedLogic, delayMS, event.newIndex );
                }
            }
    
            private function delayedLogic( index:int ):void
            {
                //disabling this results in an endless loop of trying to set the selected index
                //              doPreventDefault = false;
    
                //this should NOT be hitting the changing handler since we're supposed to be dispatching a value commit event instead.
                bb.setSelectedIndex( index, false );
            }
        ]]>
    </fx:Script>
    
    <fx:Declarations>
    
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    
    <s:layout>
        <s:VerticalLayout horizontalAlign="center"/>
    </s:layout>
    
    <s:ButtonBar id="bb"
                 changing="buttonbar_changingHandler(event)">
        <s:dataProvider>
            <s:ArrayList>
                <fx:String>btn 0</fx:String>
                <fx:String>btn 1</fx:String>
                <fx:String>btn 2</fx:String>
            </s:ArrayList>
        </s:dataProvider>
    </s:ButtonBar>
    
    <s:CheckBox label="preventDefault?"
                selected="@{ doPreventDefault }"/>
    
    <s:NumericStepper maximum="5000" minimum="500"
                      stepSize="500" value="@{ delayMS }"/>
    </s:Application>
    
    .

È stato utile?

Soluzione

Guardando lo SDK, l'evento IndexChangeEvent.CHANGING è in realtà prevenibile - nonostante la documentazione qui dice che cancellabile è falso, quindi il mio male su questo (anche se Asdoc è andato un po 'di lateralmente), tuttavia le cose diventano un po' interessanti da qui. In Listbase @ 1296 Questo è mai stato mai inviato dal metodo commitSelection(dispatchEvents:Boolean = true). In ButtonBarBase:dataProvider_changeHandler() è l'unico posto che richiede specificamente per non spedire l'evento, ma in ListBase, si chiama commitProperties @ 939 quando c'è un ProposeSlectionIndesExEx.

Quindi dal tuo codice sopra, se stai cercando di impostare la selezione - questo chiamerà il commitlection, che credo stia causando il problema della stack di chiamata. Il ritardo del timer sta per esacerbare il problema, poiché a 500 ms l'interfaccia utente avrà attraversato il suo ciclo di invalidazione almeno una volta, il che significa che il commitlection verrà eseguito di nuovo a causa di un flag invalidateProperties viene impostato dal proprosedSelectionIndex alla fine stemming da setSelectedIndex @ 729

Quindi come risolvere questo problema.
Darei solo facendo il prevenire se la convalida fallisce, altrimenti consentono di procedere normalmente. Se fallisce, chiamare il prevenzione, impostare un errorString o equivalente, ma non tentare di cambiare la selezione.

[modifica] Leggi il commento di Riastar e ho appena concordato con la stessa "soluzione".

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