actionscript 3 - AS3 Pase FlashVars a swf cargado
actionscript-3 (4)
Tengo un A.swf que carga B.swf en un clip de película y necesita pasarlo un poco de FlashVars. Al cargar B.swf con html, puedo pasar FlashVars bien. Al pasar de A.swf, obtiene un
Error # 2044: ioError no controlado :. text = Error # 2032: error de transmisión. URL: archivo:
El código en A.swf es
var request:URLRequest = new URLRequest ("B.swf");
var variables : URLVariables = new URLVariables();
variables.xml = "test.xml";
// This line causes the error 2044, else B.swf loads fine with FlashVars
request.data = variables;
loader.load (request);
En B.swf, está comprobando los Flashvars como tal. Funciona bien desde el lado html
this.loaderInfo.parameters.xml
¿Cómo arenero los permisos? Traté de agregar la carpeta a través de la configuración, pero eso tampoco funcionó.
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502
Hice un proyecto simple como nuevo. Este es el código completo.
var mc:MovieClip = new MovieClip ();
var loader:Loader = new Loader ();
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, OnComplete);
var request:URLRequest = new URLRequest ("B.swf");
var variables : URLVariables = new URLVariables();
variables.xml = "test2.xml";
// This line causes the error 2044, if i comment out, it runs fine without FlashVars
request.data = variables;
loader.load (request);
function OnComplete (e:Event)
{
trace ("On Complete");
mc = e.currentTarget.content as MovieClip;
addChild (mc);
}
Aunque el método querystring debería funcionar bien localmente, si está utilizando Flash Player 10.2, hay una API nueva para esto.
var context:LoaderContext = new LoaderContext();
context.parameters = {''xml'': ''test.xml''};
loader.load(request, context);
La documentación está aquí: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/LoaderContext.html#parameters
No es necesario que "A" pase FlashVars a "B". Simplemente haga que B acceda a FlashVars. Lo siguiente funcionará si B está dentro de A, o el nivel superior mismo:
Agregue un detector de eventos ADDED_TO_STAGE en el constructor de B. p.ej:
function B(){
this.addEventListener(Event.AddedToStage, onAddedToStageHandler);
}
Cuando tenga acceso al escenario, ahora puede acceder a FlashVars en A de esta manera:
Para ver correctamente una variable llamada myVar
flashVar en B.swf, lo haces (dentro de B):
private function onAddedToStageHandler(){
var flashVars : Object = LoaderInfo(this.stage.loaderInfo).parameters;
// now you have access to your flashVars!
trace(flashVars.myVar);
}
stage.loaderInfo
es lo que necesita mirar.
puedes agregar los flasars en el URI cuando lo estás cargando
URLRequest(String("B.swf" + "?myvar=45"));
el problema es que cuando cargó la cadena en el uri, se coloca dentro de Object loaderInfo.parameters
por lo que si desea pasar esos parámetros, debe crear una cadena para pasarlos a.
Aquí hay un script de http://ragona.com/blog/pass-flashvars-loaded-swf/ que muestra cómo convertir eso en una matriz de cadenas de nuevo
//:: Store loader info
var lInfo:Object = this.root.loaderInfo.parameters;
//:: Flashvars
var fVars:String = "?whee=nada"; //:: Getting the syntax change (? --> &) out of the way with a dummy var
//:: Set path + data
for (var flashVar in lInfo)
{
fVars += "&" + flashVar + "=" + lInfo[flashVar];
}
var myRequest:URLRequest = new URLRequest(String("/myPath.swf" + fVars));