Frage

ich habe ein Problem mit den Werten in meinen Actionscript-Komponenten zu binden. Ich mag grundsätzlich den Wert einer Variable in meiner Komponente auf einen Wert im Modell setzen, und habe die Komponente Variable automatisch aktualisiert, wenn der Modellwert aktualisiert wird. Ich denke, dass ich nicht ganz verstehen, wie Daten Werke in Flex-Bindung -. Dies kein Problem ist, wenn MXML-Komponenten verwenden, aber, wenn Actionscript-Klassen verwenden, die Bindung funktioniert nicht

Dies ist der Code, den ich verwende, wo die Werte sind nicht verbindlich:

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>
War es hilfreich?

Lösung 3

Um dies zu beheben, ich konvertiert einfach die Klassen Komponenten MXML und hat eine private Variable für meine 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>

Andere Tipps

durch Code Bindung zu verwenden, sollten Sie mx.binding.utils verwenden. *

Werfen Sie einen Blick und die BindingUtils.bindProperty und bindSetter Methoden.

Auch seien Sie vorsichtig mit manueller Datenbindung, es Ihnen zu Speicherlecks führen könnten. Um sie zu vermeiden, speichern Sie die Changezurück von bindProperty und bindSetter und unwatch Methode Aufruf Beobachter, wenn nicht mehr verwendet (das heißt, in der dipose oder Destruktormethode)

Sie müssen die [Bindable] Tag entweder auf die Klasse selbst (was alle Eigenschaften bindable) oder die Eigenschaften, die Sie [Bindable] sein wollen hinzuzufügen. Markierungseigenschaften oder Objekte als [Bindable] in Ihrer MXML nicht ausreichend ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top