Ошибка Dojo, когда элемент текстового поля даты и ContentPane используются вместе

Я использую контейнер вкладок dojo и панель содержимого, чтобы настроить диалог поиска на всех страницах моего приложения. Но он выдает ошибку «Пытался зарегистрировать виджет с id == globsearchpkg, но этот идентификатор уже зарегистрирован» на тех страницах, на которых есть текстовое поле даты dojo вместе с контейнером вкладок. Я использую Zend_Dojo_Form_Element_DateTextBox для создания текстового поля даты. Я использую следующий код для своего контейнера вкладок:

<div id="globalsearchdialogue" dojoType="dijit.Dialog" title="Global Search" style="display:none" >
<div dojoType="dijit.layout.TabContainer" style="width: 500px; height: 200px;" id="globsearchtabs">


    <div dojoType="dijit.layout.ContentPane" title="Search Packages" id="globsearchpkg"> 
      //First form here
    </div>

    <div dojoType="dijit.layout.ContentPane" title="Search Books" id="globsearchbook"> 
     //Second form here
    </div>
</div>

When i remove the date text box from the pages where the error comes up, it works fine. And if i remove the two dijit.layout.ContentPanes, it work fine. Also even with this error the tab containers and date text box works fine. The problem is that other components like context menu wont work properly once this error comes up. Any ideas?


person Black Rider    schedule 03.03.2011    source источник


Ответы (1)


Это означает, что вы добавляете виджет более одного раза или добавляете виджет один раз, удаляя его только в DOM, а затем пытаясь добавить его повторно.

Если вы действительно хотите, чтобы виджет появлялся на странице более одного раза, у вас должны быть разные идентификаторы для каждого экземпляра (идентификатор уникален).

Если вам нужен только один экземпляр на вашей странице одновременно, удаляете ли вы диалоговое окно поиска со страницы, а затем пытаетесь повторно включить его позже?

Если да, то вы, вероятно, удаляете его, вызывая parentNode.innerHTML = ''; или используя dojo.empty(parentNode) или аналогичный? Вместо этого вы должны звонить dijit.byId('globalsearchdialogue').destroyRecursive().

Этот вызов уничтожит узлы DOM, связанные с виджетом, а также очистит код JS. Помните, что dijits - это комбинация кода HTML и Javascript, поэтому вы должны правильно очистить обе части!

person mrtom    schedule 03.03.2011
comment
Я пытался использовать разные идентификаторы для каждой панели содержимого, а также для текстовых полей даты ... но все же есть эта ошибка ... Я не удаляю globalsearchdialogue в любой момент, вместо этого я просто использую dijit.byId (globalsearchdialogue) .show () ;. Ошибка возникает во время загрузки страницы и нет, когда какой-либо из моих собственных скриптов пытается что-то изменить ... - person Black Rider; 04.03.2011
comment
Что ж, «Попытка зарегистрировать виджет с id == globsearchpkg» определенно означает, что вы пытаетесь создать два виджета с одинаковым идентификатором. Другого объяснения нет. Итак, я выяснил, как это могло происходить. - person mrtom; 04.03.2011
comment
есть ли возможность получить список виджетов, зарегистрированных в додзё, например, выражение для часов или что-то в этом роде, чтобы я мог отследить, какие все виджеты были зарегистрированы в определенный момент времени ?? - person Black Rider; 04.03.2011
comment
См. Dijit / _base / manager.js. Вы можете сделать что-нибудь вроде: `dijit.registry._add = dijit.registery.add; dijit.registry.add = function (widget) {// некоторые проверки и логирование консоли; dijit.registry._add (аргументы)} - person mrtom; 04.03.2011
comment
mrtom, это помогло .. Это была проблема framework.zend.com/issues/browse / ZF-6563 это создавало проблемы ... Я идентифицировал его, используя уловку отладки, которую вы дали ... Теперь он работает отлично ... как вы сказали, я определенно пытался создать два виджета с одинаковым ID ..: D большое спасибо ... - person Black Rider; 04.03.2011
comment
ага! Я никогда не использовал zend, поэтому не смог бы это отладить, но рад, что указал вам правильное направление :) - person mrtom; 04.03.2011