2009-09-15 11 views
17

Si consideri il seguente codice:Associazione a un getter di sola lettura in 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); 
} 

C'è un setter e un getter per l'effectiveFromDateJulian, che è una rappresentazione numerica della data. Ho fornito un getter separato che recupera lo stesso valore, convertito solo in una data corretta. È solo un getter e si affida al setter per la proprietà numerica da cui ottenere i suoi dati; quindi la proprietà effectiveFromDate è effettivamente di sola lettura.

Il collegamento dati funziona sulla proprietà effectiveFromDateJulian; eventuali aggiornamenti funzionano correttamente e notificano tutto correttamente. Ma quando il legame con l'effectiveFromDate (getter solo) proprietà, ottengo un avvertimento da parte del compilatore:

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

C'è un modo per rendere possibile associare a questa proprietà di sola lettura? Supporrei che avrei dovuto inviare un evento sul setter che influenza la proprietà di sola lettura, ma non so come sarebbe.

Questo è un semplice esempio, si potrebbe immaginare una proprietà di sola lettura che dipende da diversi setter per funzionare e quando uno di questi setter viene aggiornato, la proprietà di sola lettura dovrebbe attivare anche un evento propertyChanged. Qualche idea? Per favore fatemi sapere se ho bisogno di chiarire qualsiasi cosa.

Update: Dalla documentazione di Adobe qui:

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

Utilizzando proprietà di sola lettura come fonte per l'associazione dati

È possibile utilizzare automaticamente una sola lettura immobili definito da un metodo getter, che significa nessun metodo setter, come origine per un'espressione di associazione dati. Flex esegue il binding dei dati una volta all'avvio dell'applicazione.

Poiché i dati di legame da un proprietà di sola lettura si verifica solo una volta al applicazione start up, si omette il [Bindable] tag metadati per il proprietà di sola lettura.

E questo ha senso per i valori costanti, ma in questo caso il valore cambia, semplicemente non viene impostato direttamente.

risposta

16

Effettuare il getter di sola lettura Bindable e inviare l'evento corrispondente dal metodo di settaggio originale.

[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

Questo era perfetto, esattamente quello che stavo cercando. Dopo averlo visto, ha perfettamente senso su come e perché funziona, ma non è ancora chiaro nei documenti che sia così che dovrebbe essere. Quindi, quando metti i metadati [Bindable (evento)], anche se i documenti mostrano che sono messi sul setter, in realtà è solo messo sulla proprietà (la proprietà pubblicamente esposta). Potrebbe essere facilmente inserito nel getter e funziona allo stesso modo. Solo per curiosità, hai qualche link alla documentazione o in qualsiasi altro luogo che mostra di farlo in questo modo? Grazie ancora! Questo ha aiutato molto. –

+2

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_2.html # 190306 afferma che "Se si specifica il nome dell'evento, è responsabilità dell'utente inviare l'evento quando la proprietà di origine cambia". L'ho appena provato e ha funzionato. Googling mi ha portato a http://www.deitte.com/archives/2009/04/bindable_getter.htm e http://joshblog.net/2009/07/15/flex-readonly-bindable-getter-ignored-warning- spiegato/ – Amarghosh

+1

E sì, non importa dove si inserisce il tag [Bindable] (getter o setter) che si applica alla proprietà. Anche se ai fini di Asdoc, è bene metterlo sul setter. – Amarghosh

Problemi correlati