Ciao a tutti,
sto utilizzando flex 3 actionscript 3 blaze ds e hibernate per la realizzazione di una RIA.
Ho tirato su tutto l'ambiente nel modo corretto, sulla parte server ho degli oggetti Java, creati tramite il reverse engineering di hibernate, che riflettono esattamente il db sottostante. Riporto qui sotto un esempio di Java:
public class Intervento implements java.io.Serializable {
private InterventoId id;
private Tipointervento tipointervento;
private Statopiano statopiano;
private Reparto reparto;
private Sala sala;
private Date data;
private BigDecimal ordine;
private Set<Ricoveri> ricoveris = new HashSet<Ricoveri>(0);
public Intervento() {
}
public Intervento(InterventoId id) {
this.id = id;
}
public Intervento(InterventoId id, Tipointervento tipointervento,
Statopiano statopiano, Reparto reparto, Sala sala, Date data,
BigDecimal ordine, Set<Ricoveri> ricoveris) {
this.id = id;
this.tipointervento = tipointervento;
this.statopiano = statopiano;
this.reparto = reparto;
this.sala = sala;
this.data = data;
this.ordine = ordine;
this.ricoveris = ricoveris;
}
public InterventoId getId() {
return this.id;
}
...
...
...
...
}
Come potete notare ci sono degli oggetti annidati nelle variabili della classe.
Ho inoltre realizzato classi di mapping actionscript per ogni classe java, come nell'esempio:
package Model
{
import mx.collections.ArrayCollection;
[Bindable]
[RemoteClass(alias="it.reply.santer.db.model.Interv ento")]
public class Intervento
{
public function Intervento() {}
public var id:InterventoId;
public var tipointervento:Tipointervento;
public var statopiano:Statopiano;
public var reparto:Reparto;
public var sala:Sala;
public var data:Date;
public var ordine:String;
public var ricoveris:ArrayCollection;
}
}
Supponiamo ora che da flex faccia partire un metodo presente sul server (per via di un remoteObject) il quale restituisce una lista di oggetti Intervento e supponiamo che voglia mostrare i risultati in un datagrid.
<mx:RemoteObject id="remoteService" destination="interventi" showBusyCursor="true">
<mx:method name="getAllInterventi"
result="resultHandler(event)"
fault="Alert.show(event.fault.message)"/>
</mx:RemoteObject>
<mx:ArrayCollection id="allIntAC"/>
come posso fare per richiamare i valori nelle classi annidate?
O meglio, in una colonna di datagrid come definisco un datafield affinché visualizzi per esempio il valore id.piano (id classe Intervento, piano classe InterventoId).
<mx:Button click="remoteService.getAllInterventi()"
label="Get All Interventi"/>
<mx:DataGrid id="interventiDG"
dataProvider="{allIntAC}"
width="800" height="200"
alternatingItemColors="{[0xcccccc, 0xdcdcdc]}" editable="true">
<mx:columns>
<mx:DataGridColumn headerText="ID" labelFunction="{getIDForDataGrid}" dataField="id.idintervento"
width="50"/>
<mx:DataGridColumn headerText="Piano"
labelFunction="{getPianoForDataGrid}"
dataField="id.piano"/>
<mx:DataGridColumn headerText="Ordine"
dataField="ordine"
width="75"/>
</mx:columns>
</mx:DataGrid>
Ora come ora sono stato costretto a creare una labelFunction per rendere visualizzabili ciascuno dei campi annidati di mio interesse, ma se la table è editabile e voglio effettuare una modifica su una cella mi appare l'errore:
ReferenceError: Error #1069: Impossibile trovare la proprietà piano su Model.Intervento e nessun valore predefinito presente.
at mx.controls::DataGrid/itemEditorItemEditEndHandler()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ controls\DataGrid.as:4840]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ core\UIComponent.as:9051]
at mx.controls::DataGrid/endEdit()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ controls\DataGrid.as:4031]
at mx.controls::DataGrid/deactivateHandler()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ controls\DataGrid.as:4546]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ core\UIComponent.as:9051]
at mx.controls::DataGrid/endEdit()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ controls\DataGrid.as:4031]
at mx.controls::DataGrid/mouseDownHandler()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\ controls\DataGrid.as:4277]
dato che prova direttamente a scrivere nel campo piano di model.Intervento che non esiste in quanto si trova dentro InterventoId e dovrebbe quindi essere referenziata con id.piano.
Questo problema non riguarda solo i datagrid... Vorrei quindi in sostanza sapere come gestire gli oggetti annidati tramite flex e actionscript perché è da giorni che provo a trovare una soluzione, ma nulla...
Ciao e grazie anticipatamente delle vostre risposte

Rispondi quotando