2012-06-04 64 views
1

在JSTL页面我有以下的divdijit.findWidgets返回null数组?

<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)以recersively摧毁其下所有的contentPane所有div。那么我可以用jQuery.load()重新加载内容,并使用

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

重新解析组件,以确保该选项卡窗格可以呈现(否则它不并导致内存泄漏或错误)

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

在此先感谢。

+1

更具体地说,dojo.parser.parse需要一个DOM节点。你希望''''dojo.byId'''或者甚至相当于JQuery的''''''',而不是'''dijit.byId''',它会返回一个Widget JS对象 – peller

回答

1

我会先回答2:因为dijit.findWidgets需要一个DOM节点,而不是一个小部件。如果你需要找到另一种小部件内的所有小工具,你可以使用getDescendants代替:

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

走上问题1:第一关:如果你想摧毁一个TabContainer的所有选项卡,你可以使用:

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

现在,如果我正确地理解了你,你随后从服务器抓取一串HTML(使用jQuery),并且想将它添加到TabContainer中。这个新内容包含多个ContentPane div,并且您希望它们成为TabContainer中的新选项卡。

我可能在这里是错的,但我认为这是可行的没有一些粗野的黑客。一旦你解析/实例化了一个TabContainer,你应该使用addChild添加选项卡,并传递实例化的ContentPanes。

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

<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...中。

+0

非常感谢您的快速反馈。要求实际上比这更简单。有一个ID为“refreshable”的div,其中包含tabContainer div,它实际上是需要通过jQuery重新加载的'可刷新'。问题是,每次在$ jQuery重新加载内容后,tabContainer下的所有div(比如内容窗格)都显示在一个堆栈中(我猜这是因为tabContainer没有被解析或渲染)。所以我想知道如何解决这个问题,可能会在重装之前破坏tabContainer和它下面的所有东西,然后在解析它们之后解析它们?请分享任何想法,非常感谢 – Dreamer

+1

好的。是的,在替换“可刷新”div中的内容之前,您一定要销毁TabContainer及其后代。 'dijit.byId(“dojoTabbedPane”)。destroyRecursive()'应该这样做。然后,当您向可刷新的内容添加新内容时,可以使用'dojo.parser.parse(dojo.byId(“refreshable”))解析它;' – Frode

+0

谢谢。其实我试过,但不知道为什么所有contentPanes仍然显示在没有标签和容器的堆栈上。还有一个非常有趣的发现是我使用'var result = dojo.parser.parse(dojo。byId(“refreshable”));'并将结果输出到'alert('result')',看起来每次刷新都会创建一个新的contentPane对象(显示contentPane_x,其中x不断增加)。所以我想也许还有内存泄漏,因为Dojo每次刷新都不会呈现相同的对象,而是会创建新的对象? – Dreamer