2008-11-26 14 views
12

Por lo que entiendo, el enlace a una var en ActionScript se lleva a cabo a través de eventos que se activan automáticamente cuando se cambia una var. Tengo algunas preguntas al respecto:¿Cómo funciona el enlace en ActionScript?

  1. ¿Qué ocurre si la clase no extiende explícitamente EventDispatcher? ¿Existe algún tipo de magia en el compilador que esencialmente convierte a la clase en un EventDispatcher?
  2. ¿Cómo funciona el enlace a los vars estáticos? ¿Se ha agregado a la clase algún tipo de función static addEventListener() implícita?
  3. Me di cuenta de que puede poner [Bindable] en vars estáticos pero no en funciones estáticas, ¿por qué es esto?

Editar:

Gracias a Christophe Herreman para su respuesta iluminadora. Sin embargo, tengo algunos follow-ons de mis preguntas arriba. Me pregunto si alguien podría llenar las lagunas para mí (intenté enumerar estas preguntas 4, 5, 6 pero aparecen 1, 2, 3 por algún motivo)

  1. Agregué la opción -keep al compilador y miré el código de enlace generado. ¿Alguien podría explicar cómo se aplica este código? El compilador parece generar una clase llamada BindableProperty para cada clase, que contiene getter y setter. ¿Cómo se dobla esto en la clase que escribí? La función se parece a las clases parciales en C#: ¿es esta funcionalidad del compilador exclusivamente detrás de escena, o es algo que podría usar yo mismo?

  2. La clase BindableProperty aún no implementa explícitamente EventDispatcher, ¿cómo implementa la clase generada el envío de eventos?

  3. En la pregunta 3, pregunté sobre el enlace a las funciones estáticas, pero en realidad me refería a las funciones estáticas getter y setter. Esto no parece estar permitido.

Respuesta

14

enlaces funcionan de hecho a través del envío de eventos. Puede aprender mucho del código generado de ActionScript agregando la marca de -manejar a la configuración del compilador.

Voy a tratar de responder a sus preguntas.

  1. el compilador recoger el [Bindable] etiqueta de metadatos y creará un getter y setter para cada propiedad que haya marcado como enlazable. El comprador simplemente devolverá el valor de la propiedad. El colocador verificará si el nuevo valor difiere del valor original y enviará un evento PropertyChange si lo hace.

  2. básicamente, solo ahora se crean un eliminador y un setter estáticos. Además, se crea un mx.binding.StaticPropertyWatcher para ver los cambios en las propiedades estáticas.

  3. Al enlazar a un método estático, aparece la siguiente advertencia: "[Bindable] requiere un parámetro de nombre de evento cuando se aplica a una función que no es un getter o setter". La descripción prácticamente lo dice todo. Como no tiene un evento "propertyChange" que se active específicamente para este método, debe enviar uno personalizado. Eso es [Bindable (event = "customEvent")] y luego envía ese evento desde algún lugar de tu clase.

+0

Gracias Chris, esa es una explicación muy útil. – aaaidan

Cuestiones relacionadas