Pergunta

Aqui está o código do meu 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 classe tem dois herdeiros: TextBox e ImageBox.Todas essas aulas são [Bindable].No outro componente eu seleciono Box objeto e notificar sobre este evento o componente acima com EventBus.Eu também uso para passar selecionado Box objeto.Cada TextBox objeto tem ArrayCollection de tamanhos de fonte disponíveis (fontes) e um selecionado.Eu quero amarrar meu DropDownList a esses valores de duas maneiras.Então DropDownList sempre exibe o tamanho da fonte atualmente selecionado (fonte) de uma caixa e se o usuário selecionar outro valor da lista, ele será definido como atual TextBox objeto.

Quando seleciono o objeto TextBox pela primeira vez, tudo funciona bem, mas quando seleciono outro, recebo o erro:

Erro de intervalo:Propriedade FontSize Value 0 está fora do alcance em flashx.textlayout.property::Property$/DefaUlterRorHandler () [C: Vellum Branches V2 2.0 Dev Output OpenSource TextLayout Src Flashx Text text text text Property.as:31] em flashx.textlayout.property::Property/Sethelper() Ohc:Vellumbranchesv22.0Devoutput vicultores : 230] em flashx.textlayout.formats :: textLayoutFormat/SetStylebyProperty () [C: Vellum Branches V2 2.0 dev output OpenSource textLayout src flashx textlayout formats em flashx.textlayout.formats :: textLayoutformat/set fontSize () [c: Vellum ramilos v2 2.0 dev output OpenSource textLayout src flashx textLayout formats textLayoutTat.As: .core :: csStextLayoutFormat () [e: dev 4.y frameworks Projects Spark Src Spark Core CSSTEXTLAYOUTFormat.as: 75] At Spark.comnents :: RichEdAbleText/atualiza Dev 4.Y Frameworks Projects Spark Src Spark Components RichEditableText.As: 3649] em Spark.comPonents :: RichEditAleText/CommitProperties () [E: Dev 4.y Frameworks Projects Spark src spark componentes richEditableText.as: 2509] em mx.core :: uicomponent/validateproperties () [e: dev 4.y arcramedworks Projects framework src mx core uicompton.as: 8219] em mx.Managers :: LayoutManager/validateProperties () [e: dev 4.y frameworks Projects framework src mx gerentes layoutManager.as: 597] em mx.managers :: layoutmanager/dofasestining () [E: dev 4.y frameworks Projects Framework src mx gerentes layoutManager.as: 813] em mx.managers :: layoutManager/dophasedInstationCallback () [e: dev 4.yy Frameworks Projects Framework Src MX Managers LayoutManager.As: 1180

De alguma forma selectedValue propriedade de DropDownList torna-se 0.O que estou fazendo de errado?

Foi útil?

Solução

Não é fácil ver o que está acontecendo "nos bastidores" sem depurar este aplicativo real.Você mesmo pode rastrear todos os setters para ver a ordem em que o bindibgs ocorre.

Porque o que poderia estar acontecendo na minha opinião é que as duas ligações (selectedItem e dataProvider) - não estão sincronizadas como você deseja.Você nunca sabe qual deles acontecerá primeiro e, mais importante, o que acontece dentro desse drpdownlist quando você define um deles.O resultado é que em um ponto a ligação bidirecional retorna o selectedItem que é nulo naquele momento e define 0 como fontSize (porque Number(null) é 0).E esse 0 resulta naquele erro que ocorre em outro lugar.

Apenas tente o que está realmente sendo definido no setter fontSize (coloque um trace() nele) para começar.

Você sabe, como a ligação bidirecional parece ser uma boa ideia, sempre voltei à "ligação clássica" com a manipulação de eventos de mudança (retrocedendo neste manipulador de eventos).Sempre encontramos algum problema semelhante a este ao usar a ligação bidirecional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top