Domanda

Sto avendo un problema con i valori di legame tra le mie componenti ActionScript. Io fondamentalmente voglio impostare il valore di una variabile nel mio componente per un valore nel modello, e hanno la variabile componente aggiorna automaticamente quando il valore del modello viene aggiornato. Penso che io proprio non capisco appieno come i dati opere in Flex vincolanti -. Questo non è un problema quando si utilizza componenti MXML, ma, quando si utilizza classi ActionScript, il legame non funziona

Questo è il codice che sto utilizzando, dove i valori non sono vincolanti:

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>
È stato utile?

Soluzione 3

Per risolvere questo problema, ho semplicemente convertito le classi per MXML componenti, e ha aggiunto una variabile privata per la mia 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>

Altri suggerimenti

Per usare vincolante per codice si dovrebbe usare mx.binding.utils. *

Date un'occhiata e metodi BindingUtils.bindProperty e bindSetter.

Inoltre, fare attenzione con l'associazione dati manuale, si potrebbe portare a perdite di memoria. Per evitarli, salvare il ChangeWatcher restituito da bindProperty e bindSetter e il metodo unwatch chiamata di osservatore, quando non è più utilizzato (cioè, nel metodo dipose o distruttore)

È necessario aggiungere il tag [Bindable] sia per la classe stessa (facendo tutte le proprietà associabile) o le proprietà che si desidera essere [Bindable]. Marcatura proprietà o di oggetti come [Bindable] nel vostro MXML non è sufficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top