ActionScript 3 , Flex

Encapsulando RemoteObject no FLEX 4

22 de Abril de 2010

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

package view.components
{
    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:

<?xml version="1.0" encoding="utf-8"?>
<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>

354 Download

Enviar

Compartilhe sua opiniao

Comentar

Subscribe

Acompanhe blog.

Digitrum Servers Powered by Blogcfc 5.9.2.002