2009-08-14 2 views
0

ここで私が現在取り組んでいることはここです。私はvdata.asというクラスを持っています。クラスは2つのパラメタを取ります。どちらもメインステージから送られた文字列です。パラメータ1は、開く必要があるXMLファイルの場所です。 2番目のパラメータは、現在私が探しているビデオの名前です。AS3がナッツを動かす

XMLファイルからデータを取得し、そのクラスから呼び出された場合は問題なく表示できますが、ステージからアクセスしようとすると定義されません。

import flash.net.*; 
import flash.display.*; 
import flash.events.*; 

public class videoData 
    { 
     private var mName:String; 
    private var mLink:String; 
    private var mCategory:String; 
     public static var elementArray:Array; 

     // Constructor 
    public function videoData(xmlPath:String,xmlVidSrc:String,pMC:MovieClip) 
    { 
     pXmlPath = xmlPath; 
    pXmlVidSrc = xmlVidSrc; 
    xmlloader = new URLLoader(); 
      elementArray = new Array(); 
    } 

     public function getXML() 
    { 
    XMLData(); 
     } 

     private function XMLData() 
    { 
     xmlloader.load(new URLRequest(pXmlPath)); 
    xmlloader.addEventListener(Event.COMPLETE,parseXMLData); 

     } 

     private function parseXMLData():void 
    { 
    var x:XML = new XML(xmlloader.data); 
     Init(x);  
    } 

     private function Init(m:XML):* 
    { 
     var i:Number; 
    for(i=0; i<m.videos.videoname.length(); i++) 
    { 
     if(m.videos.videoname[i][email protected] == pXmlVidSrc) 
     { 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
       } 
    } 
}   

}

Iは次のようにコードはメインステージからそれを呼び出すとき。

var xData:videoData = new videoData(xmlPath、vidSrc、this); xData.getXML();

次に、videoData.elementArrayの要素にアクセスしようとすると、定義されていません。 私の机の上に私の頭が叩かれて、これを理解しようとすると助けになります。

答えて

0

"addEventListener"はイベントを「起動」しません。 elementArrayに値が設定されたステージを宣言するブール値を追加し、init関数の後にその値を設定する必要があります。

elementDataは、videoDataのすべてのインスタンスでtrueにする必要がありますか?そうでない場合は、静的であってはなりません。 MovieClip(this.root).xDataを使用して、他のクラスのビデオクラスのインスタンスにアクセスできます。

イベントが完了し、アレイがまだ空の場合は、パーサーによって入力されませんでした。パブリックメンバーまたは好ましくは読み取り専用のプロパティとして

ブール変数を作る:

var parseComplete:Boolean; 
また、コメントに応答して> 0

EDIT elementArray.lengthがどうかを確認するためのチェックを行うことができます

コンストラクタでfalseに設定します。あなたのEvent.COMPLETEコールバックセットで通話を「初期化」の後に続いて

、:

parseComplete=true; 

次に、あなたが今までelementArrayにアクセスする前に、必ずparseComplete ==真作ります。無限にループに

while(!xData.parseComplete) { } 

:あなたはパーサを待っている場合は、いくつかの並べ替えを引き起こすタイムアウトまたは単に任意の予期せぬエラーが発生した場合のtry/catchメカニズムのいくつかの並べ替えを設定することができます完了します。それはすべて用途に依存します。個人的には、イベントリスナーからステージにコールバックを追加して、次に起こるはずのものをトリガーすることができます。

+0

ありがとうございます。申し訳ありませんが、私はあなたが「ステージのためにブール値を追加する」という意味の例を得ることができます。アイデアはあると思いますが、確かにしたいと思います。 elementArrayはtrueである必要はありません。私はそれから静的を削除しました。 – 2Alpha

+0

大変感謝しています。 – 2Alpha

+0

それはトリックですか? – McAden

1

elementArrayが静的なvarになっているのはなぜなので、関数の外側で使用するためにpublicにする必要があります。

私はかなり混乱していますが、 "De MonsterDebugger"のようなデバッグツールを試してみるとよいでしょう。まず、parseXMLData関数でxmlloader.dataをトレースします。

+0

基本的には、XMLデータを配列にダンプしてメインステージに戻すので、他のアプリケーションを使用することができます。しかし、現在は動作していません。私が言ったように、私はクラスでデータを見ることができますが、メインステージでは見ることができません。実際には、私はaddeventlistenerが発砲した後もそれを見ることができません。デバッガをチェックし、それがどうなっているかを確認してください。 – 2Alpha

関連する問題