Nella lezione precedente abbiamo visto come configurare una fonte di dati esterna, consumata tramite un servizio HTTP. Una volta realizzata la connessione, possiamo effettuare il binding dei dati con i nostri componenti. Esaminiamo il collegamento con DataGrid
.
Anzitutto trasciniamo un componente DataGrid
sullo stage dell'applicazione. Nella finestra delle proprietà impostiamo il Data provider
premendo il bottone con il simbolo del binding (la catenella).
Nella finestra che appare selezioniamo "WebNewsRSS" come servizio e GetRSS()
come operazione.
Cliccando su OK
, il Flash Builder in automatico creerà le colonne della DataGrid
e genererà anche le funzioni per la chiamata delle classi del servizio generate nel passaggio precedente.
Se lanciamo l'applicazione possiamo vedere che è già tutto funzionante. Ma qual è il lavoro che il Flash Builder ha fatto per noi? Per rendercene conto, apriamo la cartella src
nel Package Explorer, dove troviamo diverse classi create automaticamente e il namespace del nostro servizio.
Analizzando queste classi notiamo che molti dei nomi iniziano con l'underscore (_
): sono perlopiù classi che mappano gli oggetti restituiti dal servizio, ed hanno relazione diretta con le classi il cui suffisso è EntityMetadata
; le classi richiamabili dal nostro codice sono invece quelle che non hanno l'undescore iniziale, ad esempio:
- Guid
- Item
- WebNewsRSS
Queste classi, sono vuote ed estendono la classe omonima con prefisso _Super_
; sono a nostra disposizione per inserire il codice di personalizzazione opportuno.
La classe _Super_WebNewsRSS
estende la classe HTTPServiceWrapper
che si occupa della invocazione vera e propria del servizio e definisce tutte le sue operazioni nel costruttore della classe:
public function _Super_WebNewsRSS() { // initialize service control _serviceControl = new HTTPMultiService(""); var operations:Array = new Array(); var operation:Operation; var argsArray:Array; operation = new Operation(null, "GetRss"); operation.url = "http://rss.html.it/webnews.xml"; operation.method = "GET"; operation.serializationFilter = serializer0; operation.properties = new Object(); operation.properties["xPath"] = "/::channel/::item"; operation.resultElementType = valueObjects.Item; operations.push(operation); _serviceControl.operationList = operations; model_internal::initialize(); }
Subito dopo viene definita la funzione pubblica, che abbiamo chiamato GetRss()
e che svolge tutto il lavoro per noi.
Nel file .mxml
, viene dichiarato il namespace che consente di instanziare direttamente l'oggetto WebNewsRSS
.
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:webnewsrss="services.webnewsrss.*">
Nella sezione <fx:Declarations>
vengono quindi dichiarati l'oggetto WebNewsRSS
e l'oggetto CallResponder
. Viene anche dichiarata la funzione di callback per il fallimento (fault
) dell'operazione ad un messaggio diagnostico attraverso la classe Alert
; mentre non è dichiarata la funzione di callback per il risultato (result
) dell'operazione, poiché i dati vengono gestiti dal binding con la DataGrid
.
Nell'oggetto DataGrid
viene impostato un event handler ad una funzione appositamente creata: la dataGrid_creationComplete
. Inoltre viene impostata la proprietà dataProvider
con il lastResult
del CallResponder
.
<mx:DataGrid id="dataGrid"
creationComplete="dataGrid_creationCompleteHandler(event)"
dataProvider="{getRssResult.lastResult}" editable="true">
Ricapitolando, quando avviamo l'applicazione in corrispondenza dell'evento creationComplete
della DataGrid
viene invocato il metodo GetRss()
della classe WebNewsRSS
. La griglia viene popolata attraverso il databinding quando vengono caricati i dati della chiamata asincrona.
Per invocare il servizio da Actionscript è sufficiente dichiarare ed istanziare una variabile di tipo WebNewsRSS
, impostare il binding o le funzioni di callback per le operazioni di fault
e result
ed infine richiamare il metodo GetRss()
.