Pergunta

Eu estou tendo um problema com os valores obrigatório em meus componentes do ActionScript. Basicamente, eu quero definir o valor de uma variável em meu componente para um valor no modelo, e têm a variável componente de atualização automaticamente quando o valor do modelo é atualizado. Eu acho que eu só não entendo completamente como dados trabalhos em Flex ligação -. Isso não é um problema quando se usa componentes MXML, mas, ao usar classes do ActionScript, a ligação não funciona

Este é o código que estou usando, onde os valores não são obrigatórias:

package
{
    public class Type1Lists extends TwoLists
    {
        public function Type1Lists()
        {
            super();

            super.availableEntities = super.composite.availableType1Entities;

            super.selectedEntities = super.composite.selectedType1Entities;
        }
    }
}

package
{
    public class Type2Lists extends TwoLists
    {
        public function Type2Lists()
        {
            super();

            super.availableEntities = super.composite.availableType2Entities;

            super.selectedEntities = super.composite.selectedType2Entities;
        }
    }
}

/* TwoLists.mxml */
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            public var __model:ModelLocator = ModelLocator.getInstance();

            public var composite:Composite = 
                __model.selectedComposite;

            [Bindable]
            public var availableEntities:ArrayCollection;

            [Bindable]
            public var selectedEntities:ArrayCollection;
        ]]>
    </mx:Script>

    <mx:List id="availableEntitiesList" dataProvider="{availableEntities}" />

    <mx:List id="selectedEntitiesList" dataProvider="{selectedEntities}" />
</mx:HBox>
Foi útil?

Solução 3

Para corrigir isso, eu simplesmente convertido as classes de componentes MXML, e acrescentou uma variável privada para o meu ModelLocator.

/* Type1Lists.mxml */
<?xml version="1.0" encoding="utf-8"?>
<TwoLists xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns="*" 
    availableEntities="{__model.selectedComposite.availableType1Entities}" 
    selectedEntities="{__model.selectedComposite.selectedType1Entities}">
    <mx:Script>
        <![CDATA[
            import model.ModelLocator;

            [Bindable]
            private var __model:ModelLocator = ModelLocator.getInstance();
    </mx:Script>
</TwoLists>

/* Type2Lists.mxml */
<?xml version="1.0" encoding="utf-8"?>
<TwoLists xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns="*" 
    availableEntities="{__model.selectedComposite.availableType2Entities}" 
    selectedEntities="{__model.selectedComposite.selectedType2Entities}">
    <mx:Script>
        <![CDATA[
            import model.ModelLocator;

            [Bindable]
            private var __model:ModelLocator = ModelLocator.getInstance();
    </mx:Script>
</TwoLists>

Outras dicas

Para usar a ligação por código que você deve usar mx.binding.utils. *

Dê uma olhada e os métodos BindingUtils.bindProperty e bindSetter.

Além disso, tenha cuidado com ligação de dados manual, ele poderia levá-lo a vazamentos de memória. Para evitá-los, senão o ChangeWatcher retornado por bindProperty e bindSetter e método unwatch chamado de observador quando não mais é usada (ou seja, no método dipose ou destruidor)

Você precisa adicionar a tag [Bindable], quer para a própria classe (fazendo todas as propriedades bindable) ou as propriedades que deseja ser [Bindable]. Marcação propriedades ou objetos como [Bindable] em sua MXML não é suficiente.

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