【问题标题】:Destroying widgets in Dijit在 Dijit 中销毁小部件
【发布时间】:2011-07-24 09:57:02
【问题描述】:

Dojo/Dijit 中销毁 TabContainer 内的小部件的正确方法是什么?

对于每个标签,我正在加载新的BorderContainer,其中基本上包括一个包含任何小部件的小部件。但是现在我正试图让它与选项卡控件一起使用,以便它在加载新页面之前破坏前一页,我被卡住了。现在我使用全局变量来存储活动小部件名称,当用户单击新选项卡时,它会从全局变量中获取活动小部件的 id 并将其销毁,然后继续加载新的活动小部件。这可行,但是当我销毁小部件一次时,我无法让它再次出现。我收到此错误:

未捕获的错误:尝试使用 id==widget_foo_container 注册小部件,但该 id 已注册”。

我为所有小部件使用widget_XXX_container id,因此XXX 被小部件的id 替换。

我目前正在使用 dijit.byId('widget_foo_container').destroy(),但它似乎无法胜任。我也尝试过destroyDecendant()destroyRecursive(),但它们也没有产生想要的效果。看来我可能错过了一个实际上完成销毁小部件而不是仅仅从 DOM 中删除它的部分。

【问题讨论】:

  • 我实际上得到了这个工作。我需要做的是从 BorderContainer getChildren() 然后使用 forEach() destroyRecursive() & destroy()...唷,这令人沮丧的 3 个小时...
  • destroyRecursive 应该足够了 - 它调用 destroyDescendantsdestroy 本身。就此而言,我很好奇为什么在您的情况下仅在 BorderContainer 本身上调用 destroyRecursive 是不够的...

标签: javascript dojo


【解决方案1】:

查看 dijit.registry 以查看您的小部件是否仍在注册...

例子:

<div id="wrapper">
        <div id="btn1" data-dojo-type="dijit.form.Button">Button1</div>
        <div id="btn2" data-dojo-type="dijit.form.Button">Destroy button 1
            <script type="dojo/method" data-dojo-event="onClick">
                dijit.byId("btn1") && dijit.byId("btn1").destroyRecursive();
                console.debug(dijit.registry._hash);
            </script>
        </div>
        <div id="btn3" data-dojo-type="dijit.form.Button">Recreate button 1
            <script type="dojo/method" data-dojo-event="onClick">
                dojo.place(new dijit.form.Button({ label: "Button1", id:"btn1"}).domNode, "wrapper", "first");
                console.debug(dijit.registry._hash);
            </script>
        </div>
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多