1

コンテナに多くのカスタム要素を追加しているときに表示される[読み込み中]ダイアログがあります。最後に追加された要素のcreationCompleteHandlerが呼び出されたときにダイアログが消えるように設定しましたが、すべての要素が画面に表示される前にダイアログが消えます(これにより非常に大きなラグが発生します)。

これが私がしていることの例です:

for (var i:int = 0; i < 100; i++) {
    var elem:MyElement = new MyElement();
    elem.name = "elem" + i;
    container.addElement(elem);

    if (i == 99) {
        elem.creationComplete = function():void {
            PopUpManager.removePopUp(loadingDialog);
        };
    }
}

先ほど言ったように、すべての要素が画面に表示される前にダイアログが消えます。すべてのカスタム要素が追加され、現在画面に表示されていることを確認する方法はありますか?

更新: 明確にするために、elem.creationCompleteは要素のcreationCompleteHandlerが呼び出されたときに呼び出される単なるカスタムプロパティ関数です。

4

2 に答える 2

1

要素は、正しい順序で追加されていても、その順序で作成されていません:

        private function doStuff():void {
            PopUpManager.addPopUp(myPopup, this);
            for (var i:int = 0; i < 10; i++) {
                var elem:MyElement = new MyElement();
                elem.name = "elem" + i;
                container.addElement(elem);

                elem.addEventListener(FlexEvent.CREATION_COMPLETE, function(e:FlexEvent):void {
                    trace("i'm done " + e.target.name);
                });

                if (i == 9) {
                    elem.addEventListener(FlexEvent.CREATION_COMPLETE, function():void {
                        trace("i'll remove the popup " + elem.name);
                        PopUpManager.removePopUp(myPopup);
                    });
                }
            }
        }

与えます:

i'm done elem5
i'm done elem7
i'm done elem0
i'm done elem8
i'm done elem6
i'm done elem3
i'm done elem9
i'll remove the popup elem9
i'm done elem1
i'm done elem4
i'm done elem2

すべての要素が実際に作成されたことを確認するには、グローバル変数を追加する必要があります。

public var created:int = 0;

        private function doStuff():void {
            PopUpManager.addPopUp(myPopup, this);

            for (var i:int = 0; i < 10; i++) {
                var elem:MyElement = new MyElement();
                elem.name = "elem" + i;
                container.addElement(elem);
                created++; // <--- increment with each new element

                elem.addEventListener(FlexEvent.CREATION_COMPLETE, function(e:FlexEvent):void {
                    created--;  // <--- decrement when element is created
                    trace("i'm done ", e.target.name);
                    if (created == 0) {
                        trace("i'll remove it ", e.target.name);
                        PopUpManager.removePopUp(myPopup);
                    }
                });
            }
        }

結果は次のとおりです。

i'm done  elem5
i'm done  elem7
i'm done  elem0
i'm done  elem8
i'm done  elem6
i'm done  elem3
i'm done  elem9
i'm done  elem1
i'm done  elem4
i'm done  elem2
i'll remove it  elem2
于 2012-09-27T18:08:07.860 に答える
1

contentHeightこれを解決するために、PropertyChanged イベントをリッスンし、コンテナーでプロパティが変更されたときにデクリメントすることを除いて、jidma の回答に従いました。これは、コンテナーの高さが追加された要素の影響を受けた場合にのみ減少し、機能しているように見えました。

于 2012-09-27T23:27:43.030 に答える