2009-09-15 11 views
17

Considere el siguiente código:La unión a un captador de sólo lectura en AS3

[Bindable(event="ReportHeaderVO_effectiveFromDateJulian_updated")] 
public function set effectiveFromDateJulian (value:Number) : void 
{ 
    _effectiveFromDateJulian = value; 
    dispatchEvent(new FlexEvent("ReportHeaderVO_effectiveFromDateJulian_updated")); 
} 

public function get effectiveFromDateJulian() : Number 
{ 
    return _effectiveFromDateJulian; 
} 

public function get effectiveFromDate() : Date 
{ 
    return DateUtil.convertJDEJulianToDate(_effectiveFromDateJulian); 
} 

Hay un compositor y un captador para la effectiveFromDateJulian que es una representación numérica de la fecha. He proporcionado un getter separado que recupera el mismo valor, solo se convierte a una fecha adecuada. Sin embargo, es un getter y depende del setter para que la propiedad numérica obtenga sus datos; por lo que la propiedad effectiveFromDate es de solo lectura.

El enlace de datos funciona en la propiedad effectiveFromDateJulian; cualquier actualización funciona bien y notifica todo correctamente. Pero cuando se une a la effectiveFromDate (getter solamente) propiedad, recibo una advertencia del compilador:

warning: unable to bind to property 'effectiveToDate' on class 'com.vo::ReportHeaderVO' 

¿Hay alguna forma para que sea posible enlazar a esta propiedad de sólo lectura? Asumiría que tendría que despachar un evento en el setter que afecte la propiedad de solo lectura, pero no sé cómo se vería.

Este es un ejemplo simple, podría imaginarse una propiedad de solo lectura que depende de varios setters para funcionar y cuando cualquiera de esos establecedores se actualicen, la propiedad de solo lectura también debería activar un evento propertyChanged. ¿Algunas ideas? Por favor, avíseme si necesito aclarar algo.

Actualización: A partir de la documentación de Adobe aquí:

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_8.html

El uso de propiedades como la fuente para los datos de sólo lectura vinculante

Usted puede utilizar automáticamente un solo lectura propiedad definido por un método getter, que significa que no hay método setter, como el origen para una expresión de enlace de datos. Flex realiza el enlace de datos una vez cuando se inicia la aplicación.

Debido a que los de unión de un propiedad de sólo lectura de datos se produce sólo una vez en aplicación puesta en marcha, se omite el [Bindable] etiqueta metadatos para la propiedad de sólo lectura .

Y esto tiene sentido para los valores constantes, pero en este caso el valor cambia, simplemente no se establece directamente.

Respuesta

16

Haga que el getonly getter Bindable y envíe el evento correspondiente desde el método setter original.

[Bindable(event="ReportHeaderVO_effectiveFromDateJulian_updated")] 
public function set effectiveFromDateJulian (value:Number) : void 
{ 
    _effectiveFromDateJulian = value; 
    dispatchEvent(new FlexEvent("ReportHeaderVO_effectiveFromDateJulian_updated")); 
    dispatchEvent(new FlexEvent("ReportHeaderVO_effectiveFromDate_updated")); 
} 
[Bindable(event="ReportHeaderVO_effectiveFromDate_updated")] 
public function get effectiveFromDate (date:Date) : Date 
{ 
    return DateUtil.convertJDEJulianToDate(_effectiveFromDateJulian); 
} 
+0

Esto fue perfecto, exactamente lo que estaba buscando. Después de verlo, tiene total sentido sobre cómo y por qué funciona, pero todavía no está claro en los documentos que así es como debería ser. Por lo tanto, cuando coloca los metadatos [Bindable (event)], aunque los documentos muestran que se están colocando en el setter, en realidad solo se está colocando en la propiedad (la propiedad públicamente expuesta). Se podría poner fácilmente en el captador y funciona igual. Solo por curiosidad, ¿tiene algún enlace a la documentación o en cualquier otro lugar que muestre que lo haga así? ¡Gracias de nuevo! Esto ayudó mucho. –

+2

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_2.html # 190306 dice que "si especifica el nombre del evento, es su responsabilidad enviar el evento cuando cambie la propiedad de origen". Simplemente probé y funcionó. Google me llevó a http://www.deitte.com/archives/2009/04/bindable_getter.htm y http://joshblog.net/2009/07/15/flex-readonly-bindable-getter-ignored-warning- explicó/ – Amarghosh

+1

Y sí, no importa dónde coloque la etiqueta [Bindable] (getter o setter) que se aplica a la propiedad. Aunque para los fines de asdoc, es bueno ponerlo en el setter. – Amarghosh

Cuestiones relacionadas