5

我最近创建了一个我认为是基于页面的应用程序,现在它被用作嵌入式控件。“控件”需要多次卸载/重新加载。这会导致未销毁的订阅和 dijit 控件出现问题。我已经制定了必要的断开连接,registry.destroy 逻辑,但这很乏味。是否有使控件集合可销毁的最佳实践?

这是显示基本逻辑可以做什么的示例代码:http: //pastebin.com/bUUBUMP9

我在问是否存在类似于 AppDomain 的框架,可以清理在该上下文中创建的任何内容。类似于将控件嵌入到 IFRAME 中......但不是。

4

2 回答 2

4

我可以看到两种让你的生活更轻松的做法:

  1. Dijit 小部件扩展dijit/_WidgetBase,因此小部件提供(dis)connect(un)subscribe方法。您应该使用它们而不是通用用途aspect.connect()topic.subscribe()连接小部件时,因为这样小部件在被销毁时会断开连接并自动取消订阅,因此您不必这样做。

  2. 通过 组织你的小部件dijit/layout,例如使用dijit/layout/ContentPane而不是将小部件放入 DOM,因为这样你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 回答