Domanda

Ecco il codice del mio componente:

<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer 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="950" height="50" creationComplete="this_creationCompleteHandler(event)"
                   currentState="default" enabled="{currentBox!=null}">
    <s:states>
        <s:State name="default"/>
        <s:State name="boxSelected" stateGroups="admin"/>
        <s:State name="textBoxSelected" stateGroups="user"/>
        <s:State name="imageBoxSelected" stateGroups="user"/>
    </s:states>
    <s:layout>
        <s:HorizontalLayout gap="10" horizontalAlign="left" paddingBottom="10" paddingLeft="10"
                            paddingRight="10" paddingTop="10" verticalAlign="middle"/>
    </s:layout>

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            public var model:Model;

            private var _currentBox:Box = null;
            [Bindable]
            public function set currentBox(box:Box):void 
            {
                _currentBox = box;
                if(model.userType == Model.USER_TYPE_ADMIN)
                    currentState = "boxSelected";
                else if(box is TextBox)
                    currentState = "textBoxSelected";
                else if(box is ImageBox)
                    currentState = "imageBoxSelected";
                else
                    currentState = "default";
            }

            public function get currentBox():Box
            {
                return _currentBox;
            }

            protected function this_creationCompleteHandler(event:FlexEvent):void
            {
                AppEventBus.instance.addListener(AppEvent.BOX_SELECTED, boxSelectedHandler);
                AppEventBus.instance.addListener(AppEvent.PAGE_SELECTED, pageSelectedhandler);
            }

            protected function boxSelectedHandler(event:AppEvent):void
            {
                currentBox = event.data as Box;
            }

            protected function pageSelectedhandler(event:AppEvent):void
            {
                currentBox = null;
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:ToggleButton id="secureLockButton" includeIn="admin, user" width="20" height="20"
                    selected="@{currentBox.secured}"
                    styleName="secureButtonStyle"/>
    <s:DropDownList id="fontsList" includeIn="textBoxSelected" width="150" height="20"
                    selectedItem="@{(currentBox as TextBox).font}"
                    dataProvider="{(currentBox as TextBox).fonts}"/>
    <s:DropDownList id="fontSizesList" includeIn="textBoxSelected" width="60" height="20"
                    selectedItem="@{(currentBox as TextBox).fontSize}"
                    dataProvider="{(currentBox as TextBox).fontSizes}"/>
    <s:DropDownList id="boxTypes" includeIn="boxSelected" width="70" height="20"
                    dataProvider="{Box.BOX_TYPES}" selectedItem="{currentBox.boxType}"/>
    <s:TextInput id="boxName" includeIn="boxSelected" width="70" height="20"
                 text="@{currentBox.name}"/>
</s:BorderContainer>
.

Box Class ha due ereori: TextBox e ImageBox. Tutte queste classi sono [Bindable]. Nell'altro componente selezionando l'oggetto Box e notifica a questo evento il componente sopra con EventBus. Lo uso anche per passare l'oggetto Box selezionato. Ogni oggetto TextBox ha ArrayCollection delle dimensioni dei caratteri disponibili (font) e uno selezionato. Voglio vincolare il mio DropDownList a questi valori in due modi. Quindi DropDownList visualizza sempre la dimensione del carattere attualmente selezionata (carattere) di una casella e se l'utente seleziona un altro valore dall'elenco è impostato nell'oggetto TextBox corrente.

Quando selezionando l'oggetto TextBox per la prima volta tutto funziona bene ma quando ne selezionico un altro ottengo l'errore:

.

RangeError: Property FontSize Value 0 è fuori portata a flashx.textlyout.property ::property$/defaulterrorhandler()tc:\vellum\Branches\V2\2.0\\D\Textput -OPENENSOURCEKEXTLayout\SRCC\FashX\TextLayout\Flashx\TextLayout.as:31] a flashx.textlayayout.property ::property/sethetelper() tc:\vellum\branches\v2\2.0\dev-outputput -opensource\textLayout\Src\Flashx\TextLayout\Frashx\TextLayout\PropertyAxproperty.as:230] a FlashX.TextLayout.Formats :: TextLayoutFormat / SetStylebyProperty () [C: \ Vellulum \ Branches \ V2 \ 2.0 \ dev \ output \ opensource \ TextLayout \ src \ Flashx \ TextLayout \ formati \ TextLayoutFormat.as: 628] a FlashX.TextLayout.Formats :: TextLayoutFormat / Set Fontsize () [C: \ Velluto \ Rami \ V2 \ 2.0 \ dev \ output \ opensource \ TextLayout \ SRC \ Flashx \ TextLayout \ formati \ TextLayoutFormat.as: 1044] A Spark.core :: CSstextLayoutFormat () [E: \ dev \ 4.y \ frameworks \ progetti \ scintilla \ src \ scintilla \ core \ cssstextLayoutformat.as: 75] A Spark.Components :: RicheditableText / UpdateStyleSifChanged () [E: \ dev \ 4.y \ frameworks \ progetti \ candela \ src \ scintilla \ componenti \ richeditabletext.as: 3649] A Spark.components :: RICHEDITABLETEXT / ComitatoProperties () [E: \ dev \ 4.y \ frameworks \ progetti \ scintilla \ src \ scintilla \ componenti \ richeditabletext.as: 2509] A mx.core :: uicomponent / validateproperties () [E: \ dev \ 4.y \ frameworks \ progetti \ framework \ src \ mx \ core \ uicomponent.as: 8219] A mx.managers :: LayoutManager / ValidateProperties () [E: \ dev \ 4.y \ frameworks \ progetti \ framework \ src \ mx \ manager \ layoutmanager.as: 597] A mx.managers :: Layoutmanager / Dophasedinstanziazione () [E: \ dev \ 4.y \ frameworks \ progetti \ framework \ src \ mx \ gestori \ layoutmanager.as: 813] A MX.Managers :: LayoutManager / DophasedInstantiationCallback () [E: \ dev \ 4.Y \ frameworks \ progetti \ framework \ src \ mx \ gestori \ layoutmanager.as: 1180]

in qualche modo selectedValue Property of DropDownList diventa 0. Cosa sto facendo male?

È stato utile?

Soluzione

Non è facile vedere cosa sta succedendo "sotto il cappuccio" senza debug di questa app effettiva. Potresti tracciare tutti i setter da solo per vedere l'ordine in cui si verifica i BindIbgs.

Perché ciò che potrebbe essere apenning secondo me è che i due associazioni (SelectedItem e DataProvider) - non sono sincronizzati come desideri essere. Non sai mai quale accadrà prima, e ancora più importante, cosa succederà all'interno di quel DRPDownlist quando ne hai impostato uno. Risultato è, che in un unico punto i set di bidirezionali indietreggiano SelectedItem che è nullo in quel momento e imposta 0 per fontsare (perché il numero (NULL) è 0). E che 0 determina tale errore che si verifica da qualche altra parte.

prova solo ciò che è impostato in caso di impostazione di Fontsize (metti una traccia () in esso) per l'avvio.

Lo sai, poiché due way leghing sembra essere una bella idea, ho sempre finito per "Binding classico" con la gestione dell'evento di modifica (impostando indietro in questo gestore di eventi). Abbiamo sempre incontrato un problema simile a questo quando si utilizza Bindle Bind.

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