![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jun 2012
Сообщений: 142
|
Столкнулся с проблемой, когда могу работать с переменной типа URLVariables только в той функция где она получает данные.
обьявляю ее глобальной... не пашет. package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.geom.Rectangle; import flash.media.Sound; import flash.events.IEventDispatcher; import flash.net.URLLoader; import flash.text.*; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.sendToURL; import flash.net.*; public class Main extends Sprite { public var load_unit:URLVariables; public var loader:URLLoader; public function Main() { load_save(); // load_unit.k_y Будет неинициализирована тут // потому, что загрузка происходит асинхронно. // Конструктор отработает гораздо раньше, чем // закончиться загрузка. trace(load_unit.k_y); } function load_save() { var url:String = "http://bjiactb.60ru.com/unit.php"; var request:URLRequest = new URLRequest(url); request.method = URLRequestMethod.POST; var save:URLVariables = new URLVariables(); save.id = 2; request.data = save; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES configureListeners(loader); try { loader.load(request); } catch (error:Error) { trace("Unable to load requested document."); } // Локальные функции плохо реализованы в AS3, и их лучше не использовать // особенно в виду того, что тут они ни к чему. function configureListeners(dispatcher:IEventDispatcher):void { dispatcher.addEventListener(Event.COMPLETE, completeHandler); } function completeHandler(event:Event):void { //var loader:URLLoader = URLLoader(event.target); loader = URLLoader(event.target); //var load:URLVariables = new URLVariables(loader.data); load_unit = loader.data; trace(load_unit.k_y); } } } } Хотя обявлена публик. В чем косяк? Последний раз редактировалось wvxvw; 24.02.2013 в 23:48. |
|
|||||
|
Modus ponens
|
Простите, что я ваш код отформатировал, и сразу же там и комментарии оставил. Но я думаю, что так удобнее, и чтобы не повторять код лишний раз.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 142
|
Цитата:
Добавлено через 42 секунды Как? Если можно с примером |
|
|||||
|
Параметры видимости private, public и protected не влияют на видимость переменной внутри класса, в любом случае всегда будет все доступно.
Ошибка скорее всего в том, что вы пытаетесь обращаться к этой переменной (из других функций) до того, как она получит ссылку на loader.data;, то есть когда она null И скорее всего у вас функции работают синхронно, без возможности ожидания момента, когда эта load_unit получит таки значение. Решение - сделать асинхронное выполнение функций, когда код 100% ждет пока в переменной что-то есть |
|
|||||
package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.geom.Rectangle; import flash.media.Sound; import flash.events.IEventDispatcher; import flash.net.URLLoader; import flash.text.*; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.sendToURL; import flash.net.*; public class Main extends Sprite { public var load_unit:URLVariables; public var loader:URLLoader; public function Main() { load_save(); // load_unit.k_y Будет неинициализирована тут // потому, что загрузка происходит асинхронно. // Конструктор отработает гораздо раньше, чем // закончиться загрузка. //Здесь трейс работать не будет по вышеизложенной причине trace(load_unit.k_y); } function load_save() { var url:String = "http://bjiactb.60ru.com/unit.php"; var request:URLRequest = new URLRequest(url); request.method = URLRequestMethod.POST; var save:URLVariables = new URLVariables(); save.id = 2; request.data = save; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES //Убираем это, более простая замена ниже // configureListeners(loader); try { loader.load(request); } catch (error:Error) { trace("Unable to load requested document."); } //Скорее всего вы использовали пример из документации адоби. //Поскольку нам нужен только один слушатель, намного проще будет его объявить напрямую loader.addEventListener(Event.COMPLETE, completeHandler); //Так же вынесем обработчик в отдельный метод } private function completeHandler(event:Event):void { //var loader:URLLoader = URLLoader(event.target); loader = URLLoader(event.target); //var load:URLVariables = new URLVariables(loader.data); load_unit = loader.data; //А здесь трейс будет работать нормально. // Работу с вашим loader_unit следует начинать // именно с выполения этой функции trace(load_unit.k_y); } } } |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 142
|
Спс, я тоже решил проблему, задал переменную, которая меняет значение после загрузки данных и мониторим эту переменную в ентерфрейме.
|
|
|||||
|
Регистрация: Jun 2012
Сообщений: 142
|
%-) Ну на самом деле мне нравиться самому придумывать варианты выхода из положения, даже если это дико и в корне неверно. Хотя я конечно запоминаю и копи пастю, то что мне предлогают)
Добавлено через 1 минуту Ну по сути так и делается, при каком ли бо действие пользователя, которое вызывает перемещение чегонпибудь, опрашиваются данные с бд. и по их приходу перерисовывается карта. с полученными данными |
|
|||||
|
Цитата:
Периодический опрос это не асинхронное выполнение, я говорил о выбросе события с помощью .dispatchEvent Что вам нужно сделать - собственный класс, наследующий flash.Event В конце функции инициализации переменной сделать выброс вашего события с помощью .dispatchEvent Что-то вроде такого package { import flash.events.Event; public class LoaderCompleted extends Event { public static const ALL_DONE:String="All done"; public function LoaderCompleted(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } } } ... public class Main extends Sprite { ... private function completeHandler(event:Event):void { //var loader:URLLoader = URLLoader(event.target); loader = URLLoader(event.target); //var load:URLVariables = new URLVariables(loader.data); load_unit = loader.data; trace(load_unit.k_y); this.dispatchEvent(new LoaderCompleted(LoaderCompleted.ALL_DONE)); } ... } И кстати синтаксис самого класса Event может отличаться, тут старлинговое событие наследуется по-моему, но суть одна |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|