Pregunta

Estoy teniendo un problema con los valores de unión en mis componentes ActionScript. Básicamente quiero establecer el valor de una variable en mi componente a un valor en el modelo, y tienen la variable componente actualizar automáticamente cuando se actualiza el valor del modelo. Creo que simplemente no entienden completamente cómo funciona en la flexión de enlace de datos -. Esto no es un problema cuando se utiliza componentes de MXML, pero, cuando se utilizan las clases de ActionScript, la unión no funciona

Este es el código que estoy utilizando, cuando los valores no son vinculantes:

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>
¿Fue útil?

Solución 3

Para solucionar este problema, simplemente me convertí las clases de componentes MXML, y añadió una variable privada para mi 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>

Otros consejos

Para utilizar la unión en un código que debe utilizar mx.binding.utils. *

Tome una mirada y los métodos BindingUtils.bindProperty y bindSetter.

Además, tenga cuidado con el enlace de datos manual, lo que podría conducir a pérdidas de memoria. Para evitarlos, guardar el ChangeWatcher devuelto por bindProperty y bindSetter y el método llamado de unwatch observador cuando no más se utiliza (es decir, en el método dipose o destructor)

Es necesario añadir la etiqueta [Bindable] o bien a la propia clase (haciendo todas las propiedades enlazable) o las propiedades que desea ser [Bindable]. propiedades u objetos Marcado como [Bindable] en su MXML no es suficiente.

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