我使用dojo标签容器和内容窗格在我的应用的所有页面中设置搜索对话框。但它给出了一个错误“尝试注册具有id == globsearchpkg的小部件,但该ID已经注册”在那些具有dojo日期文本框以及选项卡容器的页面中。我使用Zend_Dojo_Form_Element_DateTextBox来创建日期文本框。我为tabcontainer使用以下代码:
<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>
当我从出现错误的页面中删除日期文本框时,它可以正常工作。如果我删除两个dijit.layout.ContentPanes,它工作正常。即使出现此错误,选项卡容器和日期文本框也能正常工作。问题是,一旦出现此错误,其他组件(如上下文菜单)将无法正常工作。有什么想法吗?
答案 0 :(得分:2)
这意味着您不止一次添加小部件,或者只添加一次小部件,只在DOM中删除 ,然后尝试重新添加。
如果您真的希望在页面上多次使用该窗口小部件,则每个实例必须具有不同的ID(ID是唯一的)
如果您只想在页面上同时使用一个实例,是否从页面中删除了搜索对话框,然后尝试稍后重新加入?
如果是这样,您可能是通过致电parentNode.innerHTML = '';
或使用dojo.empty(parentNode)
或类似内容将其删除的?相反,你应该打电话给dijit.byId('globalsearchdialogue').destroyRecursive()
。
该调用将破坏与窗口小部件关联的DOM节点,并清理JS代码。请记住,dijits是HTML和Javascript代码的组合,因此您必须正确清理这两个部分!