Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   HTTPService & URLLoader (http://www.flasher.ru/forum/showthread.php?t=116587)

FMensk 04.10.2008 18:45

HTTPService & URLLoader
 
Задача: надо загрузить xml в DataGrid и при этом отследить Загрузку файла (возможно использование больших документов)

для этого хорошо подходит HTTPService
элементарно переводит xml в ArrayCollection
Но невыходит отслеживать Загрузку xml документа

при помощи URLLoader можно отслеживать какая часть документа загрузилась... в тоже время каким либо легким способом перевести xml в ArrayCollection не удалось.

Может есть альтернативный метод?? или я что нибудь не так понимаю.

russia.roman 05.10.2008 14:03

Код в студию

FMensk 05.10.2008 17:21

HTTP Service:

Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
                  width="1000" height="500">
 <mx:Script>
  <![CDATA[
        import mx.binding.utils.ChangeWatcher;
            import mx.binding.utils.BindingUtils;
        private var nameBinding:ChangeWatcher;

        import fclass.fload.FHTTPService;
        public var Fhttp:FHTTPService = new FHTTPService();

        public function Init_Razdel():void {
            this.nameBinding = BindingUtils.bindProperty(DG_Razdel,
                                "dataProvider", this.Fhttp, "FRezult_text");
            this.Fhttp.HTTP_BEST();
        }
  ]]>
 </mx:Script>

 <mx:DataGrid        id="DG_Razdel" width="600" height="350" >
        <mx:columns>
                <mx:DataGridColumn dataField="number" headerText="№"/>
                <mx:DataGridColumn dataField="name" headerText="Раздел"/>
        </mx:columns>
 </mx:DataGrid>

</mx:Canvas>



fclass/fload/FHTTPService.as;
Код:


package fclass.fload
{
  import mx.collections.ArrayCollection;
  import mx.rpc.events.ResultEvent;
  import mx.rpc.http.HTTPService;
       
  public class FHTTPService
  {
        private var httpRequest:HTTPService = new HTTPService();
        [Bindable] public var FRezult_text:ArrayCollection;

    public function HTTP_BEST():void {
          httpRequest.url="menu.xml?n="+Math.random();
        httpRequest.send();
        httpRequest.addEventListener(ResultEvent.RESULT,getResult);
    }
                 
    private function getResult(event:ResultEvent):void {
          var Arr:ArrayCollection = new ArrayCollection();
          Arr = event.result.razdel.blok;
        Arr.refresh();

        //Имеем В результате ArrayCollection который подвязан под дата грид
        FRezult_text = Arr;
    }
  }
}



Пример с URLLoader...

Код:


package fclass.fload
{
        import flash.display.Sprite;
        import flash.events.*;
        import flash.net.*;
               
        public class FMURLLoader extends Sprite {
               
        [Bindable] public var Info_forME:String;
            [Bindable] public var FProgress_text:String;
            [Bindable] public var FRezult_text:String;

        public function MURLLoader():void {
            var loader:URLLoader = new URLLoader();
            configureListeners(loader);
            var request:URLRequest = new URLRequest("menu.xml?n="+Math.random());
           
            try {
                loader.load(request);
                Info_forME = "Грузим файл"+"\n";
                FProgress_text = "Загрузка ...";
               
            } catch (error:Error) {
                Info_forME = "Unable to load requested document."+"\n";
                FProgress_text = "Ошибка при загрузке";
            }
          }
                 
          private function completeHandler(event:Event):void {
            var loader:URLLoader = URLLoader(event.target);
            Info_forME += "Загрузился \n";

            //На выходе имеем xml в представлении String что бы перевести в
            //ArrayCollection надо не плохо повозиться..
            FRezult_text = loader.data;


            FProgress_text = "Файл загружен";
            FFinish();
        }

        private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(Event.OPEN, openHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        }

        private function openHandler(event:Event):void {
                Info_forME += "openHandler: " + event+"\n";
                FProgress_text = "Загрузка ...";
        }

        private function progressHandler(event:ProgressEvent):void {
            Info_forME += "progressHandler loaded: " + event.bytesLoaded + "  total: " + event.bytesTotal+"\n";

            //Отображаем процент загрузки!!! КРУТО
            FProgress_text = "Загрузка: "+Math.round(100*event.bytesLoaded/event.bytesTotal);
           
        }

        private function securityErrorHandler(event:SecurityErrorEvent):void {
            Info_forME += "securityErrorHandler: " + event+"\n";
            FProgress_text = "Ошибка при загрузке";
            FError();
        }

        private function httpStatusHandler(event:HTTPStatusEvent):void {
            Info_forME += "httpStatusHandler: " + event+"\n";
        }

        private function ioErrorHandler(event:IOErrorEvent):void {
            Info_forME += "ioErrorHandler: " + event+"\n";
            FProgress_text = "Ошибка при загрузке";
            FError();
        }
       
        private function FError():void {
                dispatchEvent(new Event("FLoadError", true));
        }
       
        private function FFinish():void {
                        dispatchEvent(new Event("FLoadFinish", true));
        }
    }
}


wvxvw 05.10.2008 22:02

А как это у вас вообще скомпилировалось? =/ По идее с такими названиями не должно... это ж додуматься надо назвать пакет Class...
Не знаю... то, что скопировано из мануала понятно, и должно работать, а что вы пытались сделать - это только вам извесно... использовать подчерки в названиях классов не принято равно как и называть методы с заглавной буквы и пихать заглавные буквы в названия пакетов. Только константы - все заглавными, ну и т.д... Ей богу, с первого взгляда какой-то ВБскрипт напоминает...

Пальцем в небо... .razdel.blok - это что? Если это узлы в ХМЛ, то что вам мешает точно так же к ним обратиться в обработчике completeHandler?

FMensk 06.10.2008 11:37

спасибо ))) Стилистику исправил)))

вот xml

Код:

<?xml version="1.0" ?>
<razdel>
 <blok>
  <number>1</number>
  <name>Главная</name>
  <date>09.09.2008 17.36</date>
 </blok>

 <blok>
  <number>2</number>
  <name>НОВОСТИ</name>
  <date>09.09.2008 17.45</date>
 </blok>

 <blok>
  <number>3</number>
  <name>О нас</name>
  <date>10.09.2008 18.21</date>
 </blok>
</razdel>

можно подробнее про то как обратиться к узлу в обработчике completeHandler?

спасибо))

wvxvw 06.10.2008 12:12

Код:

var xml:XML = XML(loader.data);
var xmllist:XMLList = xml.blok;



Часовой пояс GMT +4, время: 00:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.