Question

Voici le code de mon composant :

<?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 la classe a deux héritiers : TextBox et ImageBox.Toutes ces classes sont [Bindable].Dans l'autre composant, je sélectionne Box objet et notifier de cet événement le composant ci-dessus avec EventBus.Je l'utilise aussi pour passer la sélection Box objet.Chaque TextBox l'objet a ArrayCollection des tailles de police disponibles (polices) et une sélectionnée.Je veux lier mon DropDownList à ces valeurs de deux manières.Donc DropDownList affiche toujours la taille de police (police) actuellement sélectionnée d'une boîte et si l'utilisateur sélectionne une autre valeur dans la liste, elle est définie dans la valeur actuelle TextBox objet.

Lorsque je sélectionne un objet TextBox pour la première fois, tout fonctionne bien, mais lorsque j'en sélectionne un autre, j'obtiens l'erreur :

Erreur de plage :Property FontSize Value 0 est hors de portée sur flashx.textLayout.property::property$/defaulterrorhandler () [C: Vellum Branches V2 2.0 Dev Output OpenSource TextLayout Src Flashx TextLayout Property Property Propriété.as:31] sur flashx.textlayout.property::property/sethelper()ath : 230] sur flashx.TextLayout.Formats :: TextLayoutFormat / SetSTyleByProperty () [C: Vellum Branches V2 2.0 Dev output OpenSource TextLayout Src FlashX TextLayout Formats TextLayoutFormat.as: 628] à flashx.textLayout.Formats :: textLayOutFormat / set Fontize () [C: Vellum Branches V2 2.0 Dev output OpenSource TextLayout Src Flashx TextLayout Formats TextLayoutFormat.as: 1044] à Spark .Core :: csstextLayOutFormat () [e: dev 4.y frameworks projects Spark src Spark Core csstextLayoutFormat.as: 75] at spark.components :: richEditableText / updatestyleSifChanged () [e: Dev 4.y frameworks projects Spark src Spark Components RICHEDITableText.as: 3649] sur Spark.Components :: RichEditableText / CommitProperties () [E: dev 4.y frameworks projets Spark src Spark Components richeDitableText.as: 2509] à Mx.Core :: UIComponent / ValidateProperties () [E: Dev 4.y Frameworks Projects Framework Src Mx Core UIComponent.as: 8219] AT MX.MANAGERS :: LayoutManager / ValidAdProperties () [E: Dev 4.Y Frameworks Projects Framework Src Mx Managers LayoutManager.as: 597] à Mx.Managers :: LayoutManager / DophasyInstantiation () [E: dev 4.y frameworks projects framework src mx managers LayoutManager.as: 813] at mx.managers :: LayoutManager / dophasyInStantiationCallback () [e: dev 4.y frameworks projets framework src mx managers LayoutManager.as: 1180

D'une manière ou d'une autre selectedValue propriété de DropDownList devient 0.Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Il n'est pas facile de voir ce qui se passe "sous le capot" sans déboguer cette application.Vous pouvez retracer vous-même tous les setters pour voir l'ordre dans lequel les liaisons se produisent.

Parce que ce qui pourrait arriver à mon avis, c'est que les deux liaisons (selectedItem et dataProvider) ne sont pas synchronisées comme vous le souhaitez.Vous ne savez jamais lequel se produira en premier et, plus important encore, ce qui se passera dans cette drpdownlist lorsque vous en définirez un.Le résultat est qu'en un point, la liaison bidirectionnelle rétablit selectedItem qui est nul à ce moment-là et définit 0 sur fontSize (car Number(null) est 0).Et ce 0 entraîne cette erreur qui se produit ailleurs.

Essayez simplement ce qui est actuellement défini dans le setter fontSize (mettez-y une trace()) pour commencer.

Vous savez, puisque la liaison bidirectionnelle semble être une bonne idée, je revenais toujours à la "liaison classique" avec la gestion des événements de changement (en revenant dans ce gestionnaire d'événements).Nous avons toujours rencontré un problème similaire à celui-ci lors de l'utilisation de la liaison bidirectionnelle.

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