Question

Je suis un problème avec les valeurs de liaison dans mes composants ActionScript. Je veux essentiellement de définir la valeur d'une variable dans mon élément à une valeur dans le modèle, et ont la variable composante met automatiquement à jour lorsque la valeur du modèle est mis à jour. Je pense que je ne comprends pas bien comment fonctionne de liaison de données dans Flex -. Ce n'est pas un problème lors de l'utilisation de composants MXML, mais, lors de l'utilisation des classes ActionScript, la liaison ne fonctionne pas

Voici le code que je utilise, où les valeurs ne sont pas obligatoires:

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>
Était-ce utile?

La solution 3

Pour résoudre ce problème, je simplement converti les classes MXML composants, et a ajouté une variable privée pour mon 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>

Autres conseils

Pour utiliser la liaison par code, vous devez utiliser mx.binding.utils. *

Jetez un oeil et les méthodes BindingUtils.bindProperty et bindSetter.

En outre, soyez prudent avec databinding manuel, il pourrait vous conduire à des fuites de mémoire. Pour les éviter, sauf le ChangeWatcher retourné par bindProperty et bindSetter et la méthode unwatch de guetteur d'appel lorsque est plus utilisé (i.e., dans la méthode dipose ou destructor)

Vous devez ajouter le [Bindable] balise soit à la classe elle-même (faire toutes les propriétés bindable) ou les propriétés que vous voulez être [Bindable]. propriétés ou marquage d'objets comme [Bindable] dans votre MXML ne suffit pas.

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