2012-06-04 2 views
1

На странице JSTL У меня после дивыdijit.findWidgets возвращает нулевой массив?

<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 под ним. Тогда я могу использовать jQuery.load(), чтобы перезагрузить содержимое и использовать

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

повторно разобрать компонент, чтобы убедиться, что tabbedPane может быть оказан (в противном случае он не делает и вызвать утечку памяти или ошибку)

Здесь возникает вопрос: (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(); 

Onto вопрос 1: Во-первых: если вы хотите, чтобы уничтожить все вкладки в виде TabContainer, вы можете использовать:

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

Теперь, если я правильно вас понял, вы впоследствии захватываете строку HTML с сервера (используя jQuery) и хотите добавить его в TabContainer. Этот новый контент содержит несколько разделов ContentPane, и вы хотите, чтобы они стали новыми вкладками в 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

Большое спасибо за быструю обратную связь. Требование на самом деле проще, чем это. Существует div с id «refreshable», который содержит div tabContainer, и на самом деле это «обновляемая» необходимость перезагрузки jQuery. Проблема в том, что каждый раз после перезагрузки содержимого $ jQuery все div (скажем, панели содержимого) под tabContainer отображаются в стеке (я думаю, это потому, что tabContainer не анализируется или не отображается). Поэтому мне интересно, как это исправить, может быть, уничтожить tabContainer и все под ним перед перезагрузкой, а затем проанализировать их после этого? Поделитесь любой идеей, спасибо большое – Dreamer

+1

Хорошо. Да, прежде чем вы заменяете содержимое в «обновляемом» div, вы должны обязательно уничтожить TabContainer и его потомков. 'dijit.byId (" dojoTabbedPane "). destroyRecursive()' должен делать трюк. Затем, когда вы добавили новый контент в обновляемый, вы разбираете его с помощью dojo.parser.parse (dojo.byId («refreshable»)); ' – Frode

+0

Спасибо. На самом деле я попытался, но не знаю, почему все контент-панели все еще отображаются в стеке без вкладок и контейнера. Также очень интересно найти, что я использую 'var result = dojo.parser.parse (dojo.byId ("refreshable")); "и выводить результат на' alert ('result') ', кажется, что каждая перезагрузка создает новый объект contentPane (показывая contentPane_x, где x продолжает увеличиваться). Так что, возможно, до сих пор происходит утечка памяти, поскольку Dojo не возвращает один и тот же объект при каждой перезагрузке, а создает новые? – Dreamer

Смежные вопросы