dijit.findWidgets返回null数组?

时间:2012-06-04 13:48:31

标签: javascript widget reload dojo

在JSTL页面上,我有以下divs

<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的数组?

提前致谢。

1 个答案:

答案 0 :(得分: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...中。