Come faccio a implementare l'associazione dati in una classe ActionScript?
-
23-08-2019 - |
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>
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.