0

インスタンスを連想オブジェクトに格納する前に発生するいくつかのカスタム イベントで新しい MovieClip クラスをインスタンス化するときに存在する競合状態を解決するのに問題があります。

メインクラス

var pages:Object = {
    "page1":"page1",
    "page2":"page2"
};

for(var pageName:String in pages)
{
    pages[pageName] = buildPage(pageName, onReady);
}

function buildPage(pageName:String, onReady:Function)
{
    var newPage:MovieClip = new (getDefinitionByName(pageClass) as Class)();
    newPage.addEventListener("PAGE_READY", onReady);
    newPage.dispatchEvent(new Event("PAGE_CREATE"));
    return newPage;
}

function onReady(e:Event)
{
    for(var pageName:String in pages)
    {
        trace(typeof pages[pageName]);
    }
}

ページ 1 & 2 クラスは MovieClip を拡張します

function pageX()
{
    this.addEventListener("PAGE_CREATE",this.onCreate);
}

function onCreate(e:Event)
{
    this.graphics.beginFill(0xFF0000);
    this.graphics.drawRect(0,0,200x200);
    this.graphics.endFill();

    this.dispatchEvent(new Event("PAGE_READY"));
}

残念ながら、これがすべて発火すると、次のようになります。

string
string
object
string

後で参照できるように MovieClip インスタンスを保存する前に、元の文字列オブジェクトがまだ存在しています。これを打ち負かす方法について何か提案はありますか?

4

1 に答える 1

0

投稿したコードは、標準クラスを示していません。
このコードはムービークリップ フレームにありますか、それとも別のファイルにありますか?
しかし、投稿されたコードを見る限り、オブジェクトが配列に追加される前に発生する PAGE_CREATE イベントに問題があることがわかります。
あなたがやっている

newPage.dispatchEvent(new Event("PAGE_CREATE"));

オブジェクトを返す前に。
完全なクラスを投稿しなかったので、コードを書き直すことはできませんが、投稿したものから、 buildPage メソッドを完全に削除し、コードをループに入れて、オブジェクトが配列に追加された後にイベントをディスパッチします.
また、別の理由として、関数に多くのコードが含まれていない場合は、ループから関数を呼び出さないことをお勧めします。

for(var pageName:String in pages)
{
    var newPage:MovieClip = new (getDefinitionByName(pageClass) as Class)();
    newPage.addEventListener("PAGE_READY", onReady);
    pages[pageName] = newPage;
    newPage.dispatchEvent(new Event("PAGE_CREATE"));
}
于 2012-07-13T07:05:33.530 に答える