5

私は最近、コントロールとして埋め込まれて使用されているページベースのアプリケーションだと思ったものを作成しました。「コントロール」は、複数回アンロード/リロードする必要があります。これにより、破棄されなかったサブスクリプションとdijitコントロールに問題が発生します。必要なdisconnect、registry.destroyロジックを作成しましたが、面倒です。コントロールのコレクションを破棄可能にするためのベストプラクティスはありますか?

基本的なロジックで何ができるかを示すサンプルコードは次のとおりです。http: //pastebin.com/bUUBUMP9

そのコンテキストで作成されたものをクリーンアップできるAppDomainに類似したフレームワークが存在するかどうかを尋ねています。コントロールをIFRAMEに埋め込むのと似ていますが、そうではありません。

4

2 に答える 2

4

あなたの生活を楽にする 2 つの方法を紹介します。

  1. Dijit ウィジェットは拡張dijit/_WidgetBaseされているため、ウィジェットはメソッドを提供(dis)connect(un)subscribeます。汎用の代わりに、ウィジェットを接続するときに使用する必要がありaspect.connect()ますtopic.subscribe()。この方法では、ウィジェットが破棄されると自動的に切断され、サブスクライブ解除されるため、そうする必要はありません。

  2. ウィジェットを 経由で整理しますdijit/layout。たとえば、ウィジェットをdijit/layout/ContentPaneDOM だけに配置する代わりに を使用します。これは、 を呼び出すdestroyRecursive()だけで、ContentPaneすべての子が適切に破棄されるためです。必要に応じてコンテナをネストして、適切な粒度と視覚的な魅力を実現します (Java の と同じ概念JPanelです)。

前述の原則を適用するとdestroyRecursive()、階層の最上位のコンテナーを呼び出して dijit を破棄するだけで済みます。

于 2012-04-28T00:09:12.833 に答える
0

phusick が提供する回答の方が優れていますが、この場合は実際にはオプションではありませんでした。私は次のような解決策を思いつきました:

var dcHandles = [], dsHandles = [], dc = dojo.connect, ds = dojo.subscribe;

dojo.connect = function () {
    var h = dc.apply ( dojo, arguments );
    dcHandles.push ( h );
    return h;
};

dojo.subscribe = function () {
    var h = ds.apply ( dojo, arguments );
    dsHandles.push ( h );
    return h;
};

dojo.subscribe ( "unload", function () {    
    // restore dojo methods
    dojo.connect = dc;
    dojo.subscribe = ds;

    var w, mll;

    mll = dojo._windowUnloaders;
    while (mll.length) {
        ( mll.pop () ) ();
    }

    if ( dijit.registry ) {
        w = dijit.byId ( "topLevelItem1" );
        w && w.destroyRecursive ();
        w = dijit.byId ( "topLevelItem2" );
        w && w.destroyRecursive ();

        // destroy any other wijits
        dijit.registry.forEach ( function ( w ) {
            try
            {
                w.destroyRecursive ();
            }
            catch ( ex )
            {
                $.error ( ex );
            }
        } );
    }

    dojo.forEach ( dcHandles, function ( h ) {
        dojo.disconnect ( h );
    } );

    dojo.forEach ( dsHandles, function ( h ) {
        dojo.unsubscribe ( h );
    } );

   // reset monad-like values
    my.global.values.value1 = null;

    dcHandles = [];
    dsHandles = [];


} );

上記により、多くのコードを変更することなく、すべてが登録解除/破棄/参照解除されるという保証が得られました。

于 2012-04-30T20:42:14.597 に答える