Com a facilidade de customização do Flex, você pode agilizar a produção de suas aplicações encapsulando rotinas internas (no player) ou externas, criando um componente customizado que servirá para toda aplicação.
Aqui vou abordar o DataGrid, mas com simplicidade do ActionScript, você facilmente percebe que poderá altera-lo para outros componentes como o Combobox, o List, etc...
RemoteDataGrid.as
{
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.DataGrid;
import mx.events.DataGridEvent;
import mx.events.FlexEvent;
import mx.rpc.Fault;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.Operation;
import mx.rpc.remoting.RemoteObject;
//utilizo como base do meu componente o DataGrid
public class RemoteDataGrid extends DataGrid
{
//propriedade que configura meu acesso AMF
private var _remoteObject:RemoteObject;
//propriedade que para lock de execução remota
private var _inUse:Boolean = false;
//propriedades para configurar meu acesso AMF
public var remoteDestination:String;
public var remoteSource:String;
public var remoteShowBusyCursor:Boolean = true;
//propriedades que contém o nome do métodos remoto
public var remoteOperation:String;
public var remoteSortOperation:String;
//propriedades serão utilizadas na paginação de dados
public var remoteCount:Number = 10;
public var remoteStart:Number = 1 ;
public var remoteFilter:Object = new Object();
public function RemoteDataGrid()
{
//adiciono ação a criação do componente onde será configurado o acesso remoto
addEventListener(FlexEvent.CREATION_COMPLETE,internalStart);
super();
}
private function internalStart(event:FlexEvent):void
{
if(remoteSource != null && remoteDestination != null){
_remoteObject = new RemoteObject();
_remoteObject.destination = remoteDestination;
_remoteObject.source = remoteSource;
_remoteObject.showBusyCursor = remoteShowBusyCursor;
_remoteObject.addEventListener(ResultEvent.RESULT,gridResultHandler);
_remoteObject.addEventListener(FaultEvent.FAULT,gridFaultHandler);
if(remoteSortOperation != null){
//adiciono ação que será para ordenar no banco as colunas quando forem clicadas
addEventListener(DataGridEvent.HEADER_RELEASE,geridHeaderHandler);
}
if(remoteOperation != null){
//resgato método que será executado imediatamente a criação do componente
var currentOperation:Operation = _remoteObject.getOperation(remoteOperation) as Operation;
if(_inUse == false){
_inUse = true;
currentOperation.send(remoteStart,remoteCount,remoteFilter);
} else{
Alert.show('Is busy','Waiting');
}
}
}
}
//ação de retorno padrão
private function gridResultHandler(event:ResultEvent):void
{
var currentData:ArrayCollection = new ArrayCollection();
currentData.source = event.result as Array;
dataProvider = currentData;
_inUse = false;
}
//ação de erro padrão
private function gridFaultHandler(event:FaultEvent):void
{
Alert.show(event.fault.message.toString(),event.fault.faultCode.toString());
_inUse = false;
}
//ação de sort padrão
private function geridHeaderHandler(event:DataGridEvent):void
{
if(!_inUse){
_inUse = true;
var orderBy:String = event.dataField+' asc';
//resgato metodo para sort da Grid
var currentOperation:Operation = _remoteObject.getOperation(remoteSortOperation) as Operation;
/*
o método remoto deve esperar os parâmetros:
remoteStart - registro inicial da paginação
remoteCount - quantidae de registros da pagina
remoteFilter - critério para filtros deve conter pares de NomeColuna=Valor
orderBy - interno
*/
currentOperation.send(remoteStart,remoteCount,remoteFilter, orderBy);
} else{
Alert.show('Is busy','Waiting');
}
event.preventDefault();
}
}
}
E sua chamada na aplicação deve estar da seguinte forma:
<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/mx"
xmlns:view="view.components.*">
<view:RemoteDataGrid
remoteDestination="ColdFusion"
remoteOperation="getArtists"
remoteSortOperation="getArtists"
remoteSource="com.pcsilva.blog.blog21042010.cfml.dao.ArtistsDAO" />
</s:Application>

Eu sou Pedro Claudio, ColdFusion Developer baseado no Rio de Janeiro. 

