1

在 JSTL 页面上,我有以下 div

<div dojoType="dijit.layout.TabContainer" style="width: 100%; height: 100%;" doLayout="false" id="dojoTabbedPane" >
            <c:forEach items="${summariesMap}" var="summaryEntry">
                <div dojoType="dijit.layout.ContentPane" title="${summaryEntry.key}">

我试图找到(包括dojoTabbedPane)下的所有div,以便反向销毁它下的所有contentPane。然后我可以使用 jQuery.load() 重新加载内容并使用

dojo.parser.parse(dijit.byId("dojoTabbedPane"));

重新解析组件以确保 tabbedPane 可以呈现(否则它不会并导致内存泄漏或错误)

这里的问题是:(1)我是否在正确的轨道上重新解析dojo TabbedContainer?(2) 为什么每次 findWidgets 函数只返回大小为 0 的数组?

提前致谢。

4

1 回答 1

1

我先回答 2:因为 dijit.findWidgets 需要一个 DOM 节点,而不是小部件。如果您需要在另一个小部件中查找所有小部件,则可以使用 getDescendants 代替:

var descWidgets = dijit.byId("dojoTabbedPane").getDescendants();

关于问题 1:首先:如果要销毁 TabContainer 中的所有选项卡,可以使用:

dijit.byId("dojoTabbedPane").destroyDescendants();

现在,如果我理解正确,您随后会从服务器(使用 jQuery)获取 HTML 字符串,并希望将其添加到 TabContainer。这个新内容包含几个 ContentPane div,您希望这些成为 TabContainer 中的新选项卡。

我在这里可能是错的,但我认为如果没有一些粗糙的黑客攻击是可行的。解析/实例化 TabContainer 后,应使用 addChild 添加选项卡,并传递实例化的 ContentPanes。

这意味着,如果您从服务器(通过您的 jQuery 加载)获得这样的新 HTML 内容:

<div dojoType="dijit.layout.ContentPane" title="new tab1">foo</div>
<div dojoType="dijit.layout.ContentPane" title="new tab2">bar</div>

..那么你最好的选择是删除旧的 TabContainer 并制作一个新的,然后解析整个事情。如果您能够更改从服务器获取的内容,也许您可​​以简单地将其包装在<div dojoType="dijit.layout.TabContainer....

于 2012-06-04T15:36:45.273 回答