2015-05-14 74 views
0

我知道这似乎是一个常见的错误,我试图实现一些jquery或Dojo代码来解决这个问题,但目前为止没有任何帮助 - 我一直得到相同的错误:已经注册了Widget与ID ...dojo:小部件已经注册错误

这里是我的代码:

$("div").remove("#div_temperature_legend"); //jquery   
dojo.create("div", { id: "div_temperature_legend", innerHTML: "<p></p>" }, "legendPanel"); 
var legend = new esri.dijit.Legend({ 
       map: map, 
       layerInfos: [{ layer: layer, title: "Temperature" }], 
    }, "div_temperature_legend"); 
legend.startup(); 

上面的代码是在点击一个按钮功能和功能本身就是一个大的道场require()功能的一部分;并且第一次工作。 jQuery行似乎删除,因为传说不会在新创建的div_temperature_legend图层中重复。

无论如何,我已经尝试过dojo的destroy()函数,但我仍然得到相同的错误。我想不知何故,我需要register这个div,然后摧毁它。但是如何?哪里?在我的代码的上下文中?

理想情况下,代码应检测小部件是否存在,并且不会创建另一个图例。

谢谢。

+0

jquery代码删除'div',但小部件的引用(即esri.dijit.Legent在注册表中仍然可用。要销毁该小部件,这会删除注册表中的引用,您需要执行类似这个'legend.destroy()'在创建一个'new esri.dijit.Legend'之前。 – frank

回答

1

该错误驻留在dojo小部件的错误处置中。一旦创建完成,它将通过其ID登录到散列表中。你可以或者 a)处理小部件dojo方式 或 b)每次为小部件创建唯一ID。

如果您有多个相同类型的小部件,使用ID不是一个好主意。最好跳过ID并改用类属性。 ID将被自动分配,但您对此没有兴趣,因为选择器可以使用您分配的类名称。

+0

好吧,那么如何使用这个类的属性呢?并且不会让widget继续获取传说内容,除非我以某种方式删除它?像我现在正在使用jquery?谢谢 – IrfanClemson

+0

$('。myWidgetType')。forEach(function(el){dijit.byNode(el).destroy();} – suns

+0

// 1。销毁您的小部件的所有实例 $('。esriLegend')。forEach(function(el){dijit.byNode(el).destroy();} // 2.创建一个和你一样的新方法但用className而不是id。 var node = dojo.create(“div”,{class:“esriLegend”,innerHTML:“

”},“legendPanel”); new esri.dijit.Legend({...},节点).STARTUP(); 模板化的小部件虽然使用起来有点简单。 – suns

-1

这里是我是如何实现基于独特的Div编号@Sasha想法我的解决方案:

$("#"+div_legend_global).remove(); 
div_legend_global = "div_" + new Date().getTime().toString();//div_legend_global defined globally 
dojo.create("div", { id: div_legend_global, innerHTML: "<p></p>" }, "legendPanel"); 
var legend = new esri.dijit.Legend({ 
       map: map, 
       layerInfos: [{ layer: layer, title: "Temperature" }], 
     }, div_legend_global); 
legend.startup(); 

所以我定义了一个名为div_legend_global然后全局变量,单击按钮功能中,分配给它独特的价值。那么这个唯一值就会成为创建Legend()函数的ID。在随后的调用之后,jquery删除了独特的div,从而防止显示图例的多个实例。

现在,Dojo可能会保留它的堆栈,我认为从堆栈中删除会更好。但我现在没事。

谢谢@Sasha。

+3

我认为这会在代码中造成内存泄漏。即使domNode被销毁,dojo对象仍驻留在内存中。另一种方法是使用'dijit.registry('widget_id')。destroy()'然后重新创建图例小部件。 – frank

+0

好的,但是我在哪里以及如何将注册表添加到注册表中 - 我想我曾怀疑我需要做类似的事情,但无法弄清楚。我曾尝试domConsrtruct.destroy()但没有'帮助。谢谢 – IrfanClemson

+0

Meengla如果你正在创建它,你不需要注册这个小部件。它应该已经被注册。如果您绝对需要ID,您可以考虑的另一种方法是使用注册表的getUniqueId函数为您提供一个唯一的ID,每次您可以将其存储在您选择的某个变量中。有关getUniqueId和所有其他注册表方法的更多信息,请参阅https://dojotoolkit.org/api/#1_10dijit_registry_getUniqueId。 – Richard

相关问题