2015-05-14 73 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

相關問題