flex - que - programacion actionscript en flash
¿Puede un componente Actionscript escuchar sus propios eventos PropertyChange? (4)
El hecho de que sea posible que algo se vincule con la variable no significa que algo esté vinculado a la variable. Es un poco como el sistema de eventos: solo porque algo puede enviar un evento no significa que esté escuchando nada.
Las clases alrededor de las cuales se basa el enlace Flex son BindingUtils y ChangeWatcher. Cuando se vincula directamente en MXML (que el compilador convierte en AS3) utiliza estas clases detrás de la escena para establecer realmente el enlace. He buscado en ChangeWatcher antes y cuando se ve a través de la lista de elementos potencialmente vinculables que solo distribuye si algún objeto se muestra realmente como un oyente. El sistema de enlace completo es una envoltura inteligente del sistema de eventos en realidad.
La semántica de la vinculación en AS3 en lugar de MXML es diferente. Las sutiles diferencias (como el encadenamiento a propiedades secundarias de Objetos) que simplemente funcionan en MXML requieren trabajar en AS3 para duplicar el comportamiento (probablemente como resultado de la generación de código entre MXML y AS3).
Eche un vistazo a este documento de Adobe para obtener un poco de información sobre ChangeWatcher en código AS.
Personalmente, no uso enlaces fuera de MXML ya que siento que es torpe. En su lugar, le sugiero que escriba una función setter, ya que es más predecible (y muy probable que funcione). También sugiero que lea el código fuente de ChangeWatcher y BindingUtils. Definitivamente es uno de los AS3 más avanzados que probablemente leerá.
Tengo una clase CircleButton en Actionscript. Quiero saber cuándo alguien externamente ha cambiado la propiedad ''on''. Intento escuchar ''onChange'' pero nunca golpea ese controlador de eventos.
Sé que puedo escribir la propiedad ''on'' como get / setter pero me gusta la simplicidad de simplemente usar [Bindable]
¿Puede un objeto no escuchar sus propios eventos?
public class CircleButton extends UIComponent
{
[Bindable]
public var on:Boolean;
public function CircleButton()
{
this.width = 20;
this.height = 20;
graphics.beginFill(0xff6600, 1);
graphics.drawCircle(width/2, height/2, width/2);
graphics.endFill();
this.addEventListener(MouseEvent.ROLL_OVER, rollover);
this.addEventListener(MouseEvent.ROLL_OUT, rollout);
this.addEventListener(''onChange'', onOnChange);
}
private function onOnChange(event:PropertyChangeEvent):void {
Puede usar BindingUtils.bindSetter ()
Un ejemplo se encuentra aquí .
Uno de mis enfoques favoritos es la clase Observe que se encuentra aquí . Esencialmente usa un setter pero es un buen enfoque repetible.
Si usa la etiqueta [Bindable] sin especificar un tipo de evento, cuando la propiedad cambie su valor, se enviará un evento de tipo: PropertyChangeEvent.PROPERTY_CHANGE, que es la cadena ''propertyChange''.
Por lo tanto, para poder registrarse para escuchar ese evento, debe decir:
this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);
La razón por la que nunca se llamó a su función de escucha es que el tipo de evento no era correcto.
Tenga en cuenta que se llamará al método del oyente cuando cambie cualquiera de las variables marcadas como Bindable en su clase, no solo ''on''. Este evento viene con una propiedad llamada ''propiedad'' que indica qué variable se modificó.
Para evitar que se le llame a cada variable enlazable, debe especificar un evento en la etiqueta [Bindable]:
[Bindable(event="myOnChangeEvent")]
y despacha ese evento manualmente cuando consideras que la propiedad está cambiando (es decir, en el setter), aunque eso no parecía ser lo que querías hacer.