#flash #actionscript-3 #flash-cs5
#flash #actionscript-3 #flash-cs5
Вопрос:
Я пытаюсь вернуть XML из завершенного события обратно в основную функцию, но не могу понять, как это сделать.
Вот функции, которые я вызываю:
Основной файл:
public var mySendAndLoad:SendAndLoad = new SendAndLoad();
mySendAndLoad.sendData(url,variables)
Класс mySendAndLoad:
package
{
import flash.events.*;
import flash.net.*;
import flash.xml.XMLDocument;
public class SendAndLoad
{
public var xml:XML = new XML();
public var xmlList:XMLList;
public function SendAndLoad()
{
}
public function sendData(url:String, _vars:URLVariables):String
{
var request:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
request.data = _vars;
request.method = URLRequestMethod.POST;
loader.addEventListener(Event.COMPLETE, handleComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(request);
}
private function handleComplete(event:Event):String
{
var loader:URLLoader = URLLoader(event.target);
xml = XML(loader.data);
xmlList = xml.children();
return(xmlList[1]);
}
private function onIOError(event:IOErrorEvent):void
{
trace("Error loading URL.");
}
}
}
Я хочу, чтобы XMLList вернулся в основной файл. Но поскольку ее нет в событии, которое я вызвал (sendData), она не возвращается.
Есть идеи?
Ответ №1:
package
{
import flash.events.*;
import flash.net.*;
import flash.xml.XMLDocument;
//THIS CLASS EXTENDS EVENTDISPATCHER SO IT CAN DISPATCH EVENTS
public class SendAndLoad extends EventDispatcher
{
public var xml:XML = new XML();
public var xmlList:XMLList;
public function SendAndLoad()
{
super(null);
}
public function sendData(url:String, _vars:URLVariables):void
{
var request:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
request.data = _vars;
request.method = URLRequestMethod.POST;
loader.addEventListener(Event.COMPLETE, handleComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(request);
}
private function handleComplete(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
xml = XML(loader.data);
xmlList = xml.children();
//NEW CODE
var evt:Event=new Event(Event.COMPLETE);
dispatchEvent(evt);
//return(xmlList[1]);
}
private function onIOError(event:IOErrorEvent):void
{
trace("Error loading URL.");
}
}
}
и в главном файле
public var mySendAndLoad:SendAndLoad = new SendAndLoad();
mySendAndLoad.addEventListener(Event.COMPLETE, xmlLoadCompleted);
mySendAndLoad.sendData(url,variables)
private function xmlLoadCompleted(e:Event):void {
var childToUse:XML=mySendAndLoad.xmlList[1];
//whatever else you want to do
}
Комментарии:
1. Привет, я только что попробовал использовать этот код в своем собственном проекте. Однако Flash сообщает об ошибке для общедоступной функции sendData, сообщая, что она не возвращает значение. Я попытался установить для функции значение:void, но она по-прежнему выдает ту же ошибку. Любая помощь по этому поводу? Спасибо
2. @MrPablo, вау, я не могу поверить, что никто так долго не ловил эту ошибку. Я отредактировал ответ (изменив функцию на void), и он работает правильно. Я бы посоветовал вам очистить проект (если вы используете Flash Builder) или перезапустить Flash Pro и повторить попытку
3. Да, я понял это вскоре после публикации моего комментария!
Ответ №2:
Просто отправьте событие
package
{
import flash.events.Event;
import flash.display.Sprite;
import flash.events.*;
import flash.net.*;
import flash.xml.XMLDocument;
public class SendAndLoad extend Sprite
{
public var xml:XML = new XML();
public var xmlList:XMLList;
public function SendAndLoad()
{
}
public function sendData(url:String, _vars:URLVariables):String
{
var request:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
request.data = _vars;
request.method = URLRequestMethod.POST;
loader.addEventListener(Event.COMPLETE, handleComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(request);
}
private function handleComplete(event:Event):String
{
var loader:URLLoader = URLLoader(event.target);
xml = XML(loader.data);
xmlList = xml.children();
// return(xmlList[1]);
this.dispatchEvent( new Event( 'ONDATA' ) );
}
private function onIOError(event:IOErrorEvent):void
{
trace("Error loading URL.");
}
}
}
// usage
var sender:SendAndLoad = new SendAndLoad( );
sender.addEventListener( 'ONDATA', myXMLLoaded);
sender.sendData( url, _vars )
function myXMLLoaded( e:Event ):void{
trace(sender.xml);
}
Комментарии:
1. Как вы видите из моего опубликованного кода, оператор return закомментирован. Вместо этого вы this.dispatchEvent( событие); Теперь в основном классе, где создан объект var sender:SendAndLoad = new SendAndLoad( ); вы добавите прослушиватель событий. sender.addEventListener(событие. ЗАВЕРШЕНО, myXMLLoaded); в функции myXMLLoaded теперь вы можете получить доступ к данным в переменной, которой вы ее назначили sender.xml . Помогает ли это?
2. Если вы все еще не понимаете, мне нужно, чтобы вы отредактировали свой вопрос и опубликовали код, в котором вы создаете объект SendAndLoad .
3. Даже если мы не будем учитывать тот факт, что класс SaveAndLoad не является производным от EventDispatcher (он же не может отправлять события), этот метод не сработает, поскольку после повторной отправки события <code>target</code> события будет не загрузчиком, азначение SaveAndLoad.
4. При этом я получаю ошибку «undefined method dispatchEvent через статический тип SendAndLoad».
Ответ №3:
Без серьезных изменений у вас есть два варианта:
-
Ваш
SaveAndLoad
класс для получения EventDispatcher и отправки пользовательского события с данными в нем. -
Более чистым / не навязчивым является внесение
sendData
изменений в метод:public function sendData(url:String, _vars:URLVariables, resultHandler:Function=null):String { loader.addEventListener(Event.COMPLETE, resultHandler); }
Вы можете передать функцию, определенную в вашем основном файле, по-прежнему иметь возможность подключать внутренних прослушивателей для всего, что вы хотите в SaveAndLoad
классе, и у вас будут ваши данные.
Комментарии:
1. Я понимаю, что вы говорите, но что бы я поместил в основной файл?
2. в вашем основном файле вы определяете функцию: частная функция handleLoadComplete(событие:Событие):void { } и при вызове вашего mySendAndLoad.sendData(url,переменные) вы просто вызываете mySendAndLoad.sendData(url, переменные, handleLoadComplete) . Вы подключаете прослушиватель к загрузчику, обработчиком которого является ссылка на вашу функцию, определенную в основном файле.
Ответ №4:
you must declare variable such as public
public var variable:String;
You must use dispatchEvent;
first declare to it
public class personal_info extends EventDispatcher {
...
and you must define listener into that complete event
variable = "variable";
dispatchEvent(new Event(Event.COMPLETE));
...
And you must call just like calling normal event in another class
var sample:SampleClass = new SampleClass ();
sample.addEventListener(Event.COMPLETE , cComplete);
And you can use that variable in this class like:
private fonction (e:Event):void {
trace (e.target.variable);
}
Ответ №5:
Вы должны использовать dispatchEvent
;
сначала объявите ее
public class personal_info extends EventDispatcher { }
и вы должны определить прослушиватель в этом классе
dispatchEvent(new Event(Event.COMPLETE));