2010-02-20 24 views
7

Ho un A.swf che carica B.swf su un Movie Clip e deve passarlo a FlashVars. Durante il caricamento di B.swf con html, posso passare a FlashVars bene. Quando si passa da A.swf, si ottieneAS3 Pass FlashVars su swf caricato

Errore # 2044: IError non gestito :. text = Error # 2032: Stream Error. URL: file:

Il codice in A.swf è

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); 

In B.swf, si sta verificando gli Flashvars in questo modo. Funziona bene da un lato html

this.loaderInfo.parameters.xml 
+0

È una domanda ambigua. Ci sono due parti: 1) Come ottenere FlashVars in B, che rispondo di seguito. 2) Come passare qualsiasi tipo di variabile in B da A. –

risposta

0

è possibile aggiungere il flash vars nella URI quando si sta caricando è

URLRequest(String("B.swf" + "?myvar=45")); 

il problema è che quando è stato caricato lo stringa nella uri, è messo all'interno di un oggetto loaderInfo.parameters quindi se si desidera passare quei parametri, è necessario creare una stringa per passarli.

ecco uno script da http://ragona.com/blog/pass-flashvars-loaded-swf/ che mostra come convertire in un array di stringhe di nuovo

//:: 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)); 
+0

Grazie, ma ho dimenticato di menzionare, ho provato anche quello e dà lo stesso errore. Ho visto una pagina menzionata perché il passaggio di FlashVars non può funzionare con swf locale, è questo il problema? – Robin

+0

Non vedo ragioni per cui non funzioni, ma puoi provare "sandboxing" per le autorizzazioni per la cartella in cui si trova. – Daniel

0

Come faccio sandbox i permessi? Ho provato ad aggiungere la cartella tramite le impostazioni, ma non ha funzionato.

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502

Ho fatto un semplice come nuovo progetto. Questo è il codice 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); 
} 
+0

Ho trovato qual è il problema. Funziona se eseguo il swf nel normale lettore flash, ma non la versione di debug quando avvio dall'editor con Ctrl + Invio. Ma non riesco a eseguire il debug più hmmm .. Traccia – Robin

+0

(Security.sandboxType), mi dà localTrusted. Ho aggiunto Security.allowInsecureDomain ("*") ma non ho ancora finito. – Robin

17

Anche se il metodo QueryString dovrebbe funzionare bene a livello locale, se si sta utilizzando Flash Player 10.2, c'è una nuova API per questo.

var context:LoaderContext = new LoaderContext(); 
context.parameters = {'xml': 'test.xml'}; 
loader.load(request, context); 

La documentazione è qui: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/LoaderContext.html#parameters

+1

Vorrei poter votare dieci volte ... –

+0

Sembra essere rimosso dall'API. 'parametri' non è definito :( – roberkules

+0

@roberkules Stai mirando alla versione giusta di Flash? –

2

Non è necessario che "un" pass FlashVars a "B". Basta che B acceda allo stesso FlashVars. Quanto segue funzionerà se B è all'interno di A, o di livello superiore stesso:

Aggiungi un listener di eventi ADDED_TO_STAGE nel costruttore di B. ad esempio:

function B(){ 
    this.addEventListener(Event.AddedToStage, onAddedToStageHandler); 
} 

Quando si ha accesso allo stadio è ora possibile accedere alle FlashVars in A questo modo:

Per visualizzare correttamente una variabile chiamata myVar flashVar in B.swf, si fa (all'interno B) :

private function onAddedToStageHandler(){ 
var flashVars : Object = LoaderInfo(this.stage.loaderInfo).parameters; 
// now you have access to your flashVars! 
trace(flashVars.myVar); 
} 

stage.loaderInfo è ciò che è necessario guardare.

+0

grazie, la migliore soluzione a mio parere –

+0

Penso di sì, anche :) –

Problemi correlati