tipos para objetos juegos codigos flex data-binding actionscript mxml cairngorm

flex - objetos - codigos actionscript 3.0 para juegos



¿Cómo implemento el enlace de datos en una clase de ActionScript? (3)

Tengo un problema con los valores de enlace en mis componentes de ActionScript. Básicamente quiero establecer el valor de una variable en mi componente en un valor en el modelo, y hacer que la variable del componente se actualice automáticamente cuando se actualice el valor del modelo. Creo que simplemente no entiendo completamente cómo funciona el enlace de datos en Flex: esto no es un problema cuando se usan componentes MXML, pero cuando se usan clases de ActionScript, el enlace no funciona.

Este es el código que estoy usando, donde 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>


Debe agregar la etiqueta [Bindable] a la clase misma (haciendo que todas las propiedades sean vinculables) o las propiedades que desee que sean [Bindable]. Marcar propiedades u objetos como [Bindable] en su MXML no es suficiente.


Para solucionar esto, simplemente convertí las clases en componentes MXML y agregué 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>


Para usar el enlace por código, debe usar mx.binding.utils. *

Eche un vistazo y los métodos BindingUtils.bindProperty y bindSetter.

Además, tenga cuidado con la unión de datos manual, podría llevarlo a pérdidas de memoria. Para evitarlos, guarde el ChangeWatcher devuelto por bindProperty y bindSetter y llame al método de vigilancia de Watcher cuando ya no se use (es decir, en el método de eliminación de datos o destructor)