0
//Generating menu from XML
var linksXML:XML;
var linksLoader:URLLoader = new URLLoader();
var linksDB:Array = new Array();
linksLoader.load(new URLRequest("menu_links.xml"));
linksLoader.addEventListener(Event.COMPLETE, processXML);
function processXML(evnt:Event):void {
    linksXML = new XML(evnt.target.data);
    for (var i:int = 0; i < linksXML.link.length(); i++){
        var newLink:Array = [linksXML.link[i].@name, linksXML.link[i].@param, linksXML.link[i]];
        linksDB[i] = new Array(newLink);
        trace(linksDB);
    }
}
trace(linksXML.*);

出力は

Second trace: 
null
First trace: 
<menu>
  <link name="first" param="true">first.php</link>
  <link name="second" param="true">second.php</link>
  <link name="third" param="true">third.php</link>
</menu>

したがって、私の意見では、フラッシュは関数を終了するときに変数を失います。助けてください!なぜこれが起こるのか分かりません

前もって感謝します!

4

3 に答える 3

1

Event.COMPLETEas3 は非同期であるため、XML データは、ハンドラーがタスクを完了したときにのみ、linksXML 変数に格納されています。関数内の linksXML 変数をトレースしprocessXMLます。

編集:

function processXML(e:Event):void{
        .....
        .....
    futureAction();
}
function futureAction():void{
     trace(linksXML);
}
于 2012-09-14T10:54:42.257 に答える
0

実際には存在しますが、ハンドラーの外でトレースすると初期化されません。次のようなコードを想像してみてください。

  1. 変数の初期化
  2. xml を読み込む
  3. xml ローダーのロード完了ハンドラーを設定する
  4. トレースxml

上記で定義したにもかかわらず、processXMLを省略しました

trace(linksXML.*);

そこで呼び出されるという意味ではなく、URLLoader の読み込みが終了したときに呼び出される非同期関数です。ロード直後に xml をトレースしているため、その時点では xml の準備ができていません。

役立つ場合は、これを試してください:

var linksXML:XML;
var linksLoader:URLLoader = new URLLoader();
var linksDB:Array = [];
linksLoader.load(new URLRequest("menu_links.xml"));
linksLoader.addEventListener(Event.COMPLETE, processXML);
function processXML(evnt:Event):void {
    linksXML = new XML(evnt.target.data);
    for (var i:int = 0; i < linksXML.link.length(); i++){
        linksDB[i] = [linksXML.link[i].@name, linksXML.link[i].@param, linksXML.link[i]];
        trace(new Date() + " xml parsed: \n"+linksDB);
    }
}
addEventListener(Event.ENTER_FRAME,checkXML);
function checkXML(event:Event):void{
    trace(new Date(),linksXML);
    if(linksXML != null) removeEventListener(Event.ENTER_FRAME,checkXML);
}

xml に何が起こるかを簡単に確認できるはずです。もちろん、processXML でその XML に依存する他のアクションをトリガーするだけです。ENTER_FRAMEハンドラーは必要ありません。要点を説明するためだけに存在します。

つまり、変数は関数の外部からアクセスできます。それは、 processXML が呼び出されるまで値を持たないということです。その後、準備完了です。役立つ場合は、デバッガーも自由に使用してください。

于 2012-09-14T11:12:23.757 に答える
0

投稿のタイトルは、範囲の問題を示唆しています。関数の外で配列を定義したようです。ただし、適切な方法であるかどうかはわかりvar linksDB:Array = new Array();ません。試すvar linksDB:Array = [];

これは、私がずっと前にまとめた単純な XML をロードしたものです。コンテンツはあなたがしていることとは関係ありませんが、あなたが私のような人なら、実際の例が役立つかもしれないと感じました:)

var xmlLoad = new URLLoader(xmlLocation);
xmlLoad.addEventListener(Event.COMPLETE, buildSlider);

function buildSlider(e){

    var adList = new XML(e.target.data);
    numPics = adList.ad.length();

    for(var i in adList.ad){
        var pic = new Pic;
        pic.pic = adList.ad[i].pic;
        pic.clicky = adList.ad[i].clicky;
        pic.init();
        pic.x = picWidth * i;       
        contentHolder.addChild(pic);
    }   
    endChecker();

    // autoplay until end of list, or until user clicks
    autoInterval = setInterval(nextButtClick, 4000);
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<ads>

    <ad>
        <pic>40-Hinton-Gardens.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>644-Haymarket-Lane.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>756-Cambridge-Lane.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>

    <ad>
        <pic>9809-Charolais-Drive.jpg</pic>
        <clicky>http://corderhomes.com</clicky>
    </ad>


</ads>

うまくいけば、それは少し役立ちます:)頑張ってください!

于 2012-09-14T12:39:10.550 に答える