1

私はパッケージの使用法を探求し始めたばかりです。関数の結果(変数「myXML」として)をコードの他の要素で使用できるようにしたいと思います。そして、新しいクラスファイルを作成することが道であるかどうか疑問に思っています。例えば:

package  
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;    

    public class XMLLoad 
    {
        public var myXML:XML;
        public var myLoader:URLLoader = new URLLoader();
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);

        public function processXML(e:Event):void 
        {
            myXML = new XML(e.target.data);
            trace(myXML);
        }

    }

}

これはグローバル変数を作成するための良い方法ですか?もしそうなら、FLAファイルで、XMLデータを保持する変数「myXM」にどのようにアクセス/使用しますか?

import XMLLoad;
XMLLoad();
?

どうもありがとう。

4

3 に答える 3

2

クラスで行ったことはほとんどありますが、修正が必要なことがいくつかあります。

まず、クラス減速のトップレベル内では、メンバー(プロパティとメソッド)のみを定義できます。現時点では、これはすばらしいことですが、このスコープでも実際のコードを実行しようとしています。

myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
myLoader.addEventListener(Event.COMPLETE, processXML);

これはスローしてエラーになり、クラスは機能しなくなります。クラスのインスタンスが作成されたときにすぐにコードを実行するにはconstructor、で宣言されているクラスと同じ名前を使用する関数であるを使用する必要があります(これは大文字と小文字が区別されます)。これをコードに変換すると、次のようになります。コンストラクターを作成し、その中に犯人コードを配置したことに気付くでしょう。

public class XMLLoad 
{

    public var myXML:XML;
    public var myLoader:URLLoader = new URLLoader();


    // This is the constructor.
    public function XMLLoad()
    {
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }


    public function processXML(e:Event):void 
    {
        myXML = new XML(e.target.data);
        trace(myXML);
    }

}

これで、クラスが作成されますXMLLoad。キーワードを使用すると、そのクラスのインスタンスnewを作成できます。あなたの場合、次のように、必要なことを実行するために必要なインスタンスは1つだけです。

var xmlLoad:XMLLoad = new XMLLoad();

これにより、のインスタンスが作成されXMLLoad、変数に割り当てられます。これxmlLoadにより、そのクラスで定義したプロパティとメソッドにアクセスできるようになります。上で作成したコンストラクターも自動的に実行されます。つまり、クラスは既にXMLのリクエストを開始しています。

残念ながら、外部データのリクエストは非同期であるため(つまり、アプリケーションの自然なフローとは異なるタイムラインで実行されるため)、XMLが完全に読み込まれたかどうかを判断できず、外部から使用できます。クラス。しかし、私たちにできることは、XMLLoadクラスを少し変更して私たちを助けることです。

public class XMLLoad 
{

    public var myXML:XML;
    public var myLoader:URLLoader = new URLLoader();
    private var _callback:Function;

    public function XMLLoad(callback:Function)
    {
        _callback = callback;
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }

    public function processXML(e:Event):void 
    {
        myXML = new XML(e.target.data);
        _callback(myXML);
    }

}

ここで行ったことは、関数への参照を受け入れるようにコンストラクターを変更することです。関数は、型の引数を受け入れる必要がありますXML。次にprocessXML、コールバックを実行し、受信したXMLを送信するように関数を変更しました。これは、これを実行できることを意味します。

var xmlLoad:XMLLoad = new XMLLoad(done);

function done(xml:XML):void
{
    trace(xml);
}

これは、関数内でアプリケーションを続行できることを意味します。これdoneにより、完全にロードされたXMLを使用できるようになります。

于 2012-09-12T05:15:24.710 に答える
2
  1. 「Variables.as」というクラスを作成します

  2. その中のコードはそのようなものです(注:関数はなく、変数のみ):

    // Define these variables in the normal place where you would 
    // define them in an AS3 class/package
    
    public static var enabled:Boolean = false;
    public static var configXMLData:XML;
    
  3. 使用法、Variables.asをインポートし、Variables.enable = trueまたはtrace(Variables.enable)などを使用して呼び出して設定します。必要な変数のパブリック静的変数リストに追加します。

  4. XMLの読み込みは、外部クラスまたはメインアプリケーションで実行できます。AS3(違反なし)についてあまり知らないようですので、とりあえずシンプルにして、メインクラスに留めておきます。すべてのコードアシストはAdobeLiveDocsにあります(グーグルで検索するときにいくつかのキーワードがあります)。AS3LoadXMLgooglesはあなたにたくさんの例を与えるでしょう。セットアップ、ロード、ロード完了、データの取得が必要なプロセスフローであることに注意してください。したがって、onComplete関数が呼び出されて初めて、アプリケーションを続行します。

  5. XMLが読み込まれると、Google upAS3E4X解析が行われます。これは、XML E4XforAS3を使用して属性とノードコンテンツの値を取得できる大きなテーマです。参照する例が必要になるのは難しくありません。XMLリストという古い方法もあります。これは、ドキュメント化された例のAdobe LiveDocsxmlListを見つけることができます。これについて十分に理解すると、クラスドキュメントVariables.asで変数を自由に設定できるようになります。そして、それらが必要な場所に関係なく、たとえば、必要なクラスでVariables.enableを呼び出すだけです。

于 2012-09-12T01:18:03.330 に答える
2

Marty Wallaceの回答は、質問に回答して機能させるために知っておく必要のあるすべてを網羅しています。ただし、これらの変数をグローバルにしようとしているため、危険な落とし穴が1つあることを付け加えておきます。

危険なのは、呼び出すたびnewに、変数の新しいインスタンスを取得することです。それぞれが異なる値を持つ2つ以上のグローバルのセットを誤って作成することは非常に簡単です。

解決策は2つあります。変数のみを使用するstaticか、クラスをシングルトンとして記述することです。

最初の方法ははるかに簡単です。変数にstaticキーワードを追加しXMLLoad.、新しいインスタンスを作成する代わりに、変数をvariable_nameで参照することを忘れないでください。

public class XMLLoad {
    public static var myXML:XML;
    public static var myLoader:URLLoader = new URLLoader();
    private static var _callback:Function;

    public static function loadXML(callback:Function):void
    {
        _callback = callback;
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }

    public function processXML(e:Event):void 
    {
        myXML = new XML(e.target.data);
        _callback(myXML);
    }
}

次に、マーティからもう一度借りるには:

XMLLoad.loadXML(done);

function done(xml:XML):void {
    trace(xml);
}

これは素晴らしいことですが、より複雑な状況では、少し言葉が多くて混乱します。一方、シングルトンは同じように機能しますが、通常のクラスと同じように動作します。内部の仕組みはもう少し複雑になる可能性がありますが。

public class XMLLoad {
    /**
     *  A static variable that holds the actual instance of the class.
     **/
    private static var instance:XMLLoad;

    public var myXML:XML;

    /**
     *  An initialization method that replaces the constructor and creates
     *      (if it didn't already exists) and returns the instance for external
     *      use.
     **/
    public static function GetLoader():XMLLoad {
        if (!instance) {
            instance = new XMLLoad;
        }
        return instance;
    }

    public function loadXML(callback:Function):void {
        _callback = callback;
        myLoader.load(new URLRequest("http://myWebsite/myFile.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXML);
    }

    private function processXML(e:Event):void {
        myXML = new XML(e.target.data);
        _callback(myXML);
    }
}

このクラスの呼び出しは次のようになります。

var xmlLoader:XMLLoad = XMLLoad.GetLoader();
xmlLoader.loadXML(done);

function done(xml:XML):void {
    trace(xml);
}
于 2012-09-12T13:58:55.510 に答える