Pregunta

Aquí está mi código del 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 la clase tiene dos herederos: TextBox y ImageBox.Todas estas clases se [Bindable].En el otro componente I seleccione Box objeto y notificar acerca de este evento, el componente anterior con EventBus.También la uso para pasar seleccionado Box objeto.Cada TextBox objeto tiene ArrayCollection disponible de tamaños de fuentes (tipos de letra) y un seleccionado.Quiero enlazar mi DropDownList a estos valores de dos maneras.Así DropDownList siempre muestra seleccionada actualmente tamaño de fuente (font) de un cuadro y si el usuario seleccione otro valor de la lista que se establece en el actual TextBox objeto.

Cuando yo seleccione el objeto de cuadro de texto para el primer momento todo funciona bien pero cuando voy a seleccionar otro me sale el error:

RangeError:La propiedad fontSize valor 0 está fuera de rango en flashx.textLayout.property::Property$/defaultErrorHandler()[C:\Vellum\branches\v2\2.0\dev\output\openSource extLayout\src\flashx extLayout\property\Property.as:31] en flashx.textLayout.property::Property/setHelper()[C:\Vellum\branches\v2\2.0\dev\output\openSource extLayout\src\flashx extLayout\property\Property.as:230] en flashx.textLayout.formats::TextLayoutFormat/setStyleByProperty()[C:\Vellum\branches\v2\2.0\dev\output\openSource extLayout\src\flashx extLayout\formats extLayoutFormat.as:628] en flashx.textLayout.formatos::TextLayoutFormat/set fontSize()[C:\Vellum\branches\v2\2.0\dev\output\openSource extLayout\src\flashx extLayout\formats extLayoutFormat.as:1044] en spark.core::CSSTextLayoutFormat()[E:\dev\4.y\frameworks\projects\spark\src\spark\core\CSSTextLayoutFormat.as:75] en spark.components::RichEditableText/updateStylesIfChanged()[E:\dev\4.y\frameworks\projects\spark\src\spark\components ichEditableText.as:3649] en spark.components::RichEditableText/commitProperties()[E:\dev\4.y\frameworks\projects\spark\src\spark\components ichEditableText.as:2509] en mx.core::UIComponent/validateProperties()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:8219] en mx.managers::LayoutManager/validateProperties()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597] en mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:813] en mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]

De alguna manera selectedValue propiedad de DropDownList se convierte en 0.¿Qué estoy haciendo mal?

¿Fue útil?

Solución

No es fácil ver lo que está acontecimiento "bajo el capó" sin depurar esta aplicación real.Usted podría hacer un seguimiento de todos los setters de sí mismo para ver el orden en el que el bindibgs se produce.

Porque, ¿qué podría ser está pasando en mi opinión es que los dos enlaces (selectedItem y dataProvider) - no están en sincronía como usted desea ser.Nunca se sabe cuál va a suceder primero, y más importante aún, ¿qué sucede en el interior que drpdownlist cuando se establece uno de ellos.El resultado es, que en un punto los dos-manera-de unión se establece de nuevo selectedItem que es nulo en ese momento y conjuntos de 0 a fontSize (porque el Número(null) es 0).Y que 0 resultados en que el error que se produce en algún otro lugar.

Sólo trate de lo que es en realidad estar en fontSize setter (poner un trace() en ella) para empezar.

Ustedes saben, desde dos vías de unión parece ser buena idea, siempre me terminó de vuelta a la "clásico de unión" con el manejo de eventos de cambio (valor en este controlador de eventos).Siempre se cumplen algún problema similar a este cuando se utiliza de dos vías se unen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top