2012-06-04 63 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