10

私は、40 を超えるコントローラー、100 を超えるストア、100 を超えるモデルなどを含む比較的大規模な ExtJS MVC アプリケーションに取り組んでいます。私は可能な MVC の方法を厳格に守っていないので、必要に応じて最初にコントローラーを初期化し、ストアを初期化する遅延コントローラー初期化を実装しました。また、コントローラー内にビューを登録しませんが、それは単に必要がないためです。

フォーム (Ext.window.Window 内で開かれる) が表示されるまでに約 1 ~ 2 秒かかりますが、かなり小さなプロジェクト内の同じフォームはすぐにポップアップします。だから、フォーム(レイアウト)はここで問題になることはできません。しかし、どのようにするのが最善の方法なのか、またはこれを行うための優れたチュートリアルが既にあるかどうかはよくわかりません。これをプロファイリングして、(EventPipe 自体だけでなく) パイプ全体にかかる時間を確認するとよいと思います。

イベント構造:

ほとんどのイベントcontrol()は、担当するコントローラーを介して登録されます。他のすべてのイベントは、せいぜい に登録され{ single: true }ます。ウィンドウは閉じられ、再利用されると再インスタンス化されます。

4

1 に答える 1

6

恐れ入りますが、ExtJSはイベントプロファイリングを提供していません。カスタムイベントシステムを使用しています。

これが私がこの問題の解決策をどのように見ているかです。

フレームワークで使用されるイベントをディスパッチおよび処理する機能を提供するExt.util.Eventクラスと、すべてのフレームワークイベントをディスパッチするための単一ポイントを提供するExt.app.EventBusがあります(fireEventはExt.app.EventBus.dispatchメソッドの単なるラッパーです) )。

クラスはプライベートなので、ソースコードを確認することをお勧めします。

これらのクラスをオーバーライドして、Ext.app.EventBus.dispatchメソッドを呼び出し、Ext.util.Event.fireメソッド内でイベントリスナーを呼び出すのにかかる時間を確認できます(EventProfilerは独自のクラスであると想定されています)

Ext.app.EventBus

dispatch: function (/* event name or Ext.util.Event */event, /* Target class */ target, args) {
    //start timing
    var start = new Date();

    /* ... */

    for (i = 0, ln = events.length; i < ln; i++) {
        event = events[i];
        // Fire the event!
        if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) {
            return false;
        }
        // start event profiling
        // here we are sure that event is dispatched and it's instance of Ext.util.Event
        EventProfiler.startProfile(event, /* time passed from dispath method started */new Date() - start);
    }

    /* rest of dispatch method call */
}

Ext.util.Event

fire: function () {
    /* ... */
    if (listener.o) {
        args.push(listener.o);
    }

    EventProfiler.endProfile(this);

    if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) {
        return (me.firing = false);
    }

    /* ... */       

}
于 2012-09-15T10:16:22.410 に答える