2015-05-14 4 views
0

Я знаю, что это похоже на общую ошибку, и я попытался реализовать некоторые jquery или Dojo-код, чтобы исправить эту проблему, но ничего не помогло до сих пор - я продолжаю получать ту же ошибку: виджет уже зарегистрирован с удостоверением ...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, но я все равно получаю ту же ошибку. Я думаю, что-то, где-то мне нужно до register этот div, а затем уничтожить его. Но как? где? В контексте моего кода?

В идеале код должен обнаруживать виджет, если он существует, и не создает другую легенду.

Спасибо.

+0

Код jquery удаляет 'div', но ссылка на виджет (т.е. esri.dijit.Legent по-прежнему доступна в реестре). Чтобы уничтожить виджет, который удаляет ссылку в реестре, вам нужно сделать что-то вроде это. 'legend.destroy()' перед созданием 'new esri.dijit.Legend'. – frank

ответ

1

Ошибка заключается в неправильном размещении виджета dojo. После его создания он будет установлен в хеше реестра по его идентификатору. Вы можете либо a) установить вид виджетов dojo или b) каждый раз создавать уникальный идентификатор для виджета.

В случае, если у вас есть несколько виджетов такого же типа, использование идентификатора - не очень хорошая идея. лучше пропустить идентификатор и вместо этого использовать атрибут класса. ID будет автоматически назначаться, но у вас нет интереса к нему, поскольку селектор может использовать имя класса, которое вы назначили.

+0

Итак, как использовать атрибуты класса? И не будет ли виджет получать содержание легенд, если я его каким-то образом не удаляю? Я использую jquery прямо сейчас? Спасибо – IrfanClemson

+0

$ ('. MyWidgetType'). ForEach (function (el) {dijit.byNode (el) .destroy();} – suns

+0

// 1. уничтожить все экземпляры вашего виджета $ ('. esriLegend'). forEach (function (el) {dijit.byNode (el) .destroy();} // 2. Создайте новый так же, как и вы но с классомName вместо id. var node = dojo.create ("div", {class: "esriLegend", innerHTML: "

"}, "legendPanel"); новый esri.dijit.Legend ({...}, Узел) .startup(); Шаблонный виджет немного проще в использовании. – suns

-1

Вот как я осуществил мое решение, основанное на идее @Sasha уникальных идентификаторов Div:

$("#"+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, а затем, в функции нажмите на кнопку, присвоить его уникальное значение. Тогда это уникальное значение становится идентификатором функции create Legend(). После последующих вызовов jquery удаляет уникальный div, тем самым предотвращая появление нескольких экземпляров легенд.

Теперь, Dojo может держать в своем стеке div, и я думаю, что лучше было бы удалить его из стека. Но сейчас я в порядке.

Спасибо @Sasha.

+3

Я думаю, что это создаст утечки памяти в вашем коде. Несмотря на то, что domNode уничтожен, объект dojo все еще находится в памяти. Альтернативным подходом было бы использовать 'dijit.registry ('widget_id'). Destroy()', а затем воссоздать виджет легенды. – frank

+0

Хорошо, но где и как добавить div в реестр - я думаю, я подозревал, что мне нужно будет что-то сделать, но не мог понять. Я попробовал domConsrtruct.destroy(), но не помог. Спасибо – IrfanClemson

+0

Meengla вам не нужно регистрировать виджет, если вы его создаете. Он уже должен быть зарегистрирован. Еще одна альтернатива, которую вы можете изучить, если вам абсолютно нужны идентификаторы, заключается в использовании функции getUniqueId в реестре, чтобы каждый раз, когда вы можете хранить в какой-либо переменной, вы получаете уникальный идентификатор по вашему выбору. Дополнительную информацию о getUniqueId и всех других методах реестра см. В https://dojotoolkit.org/api/#1_10dijit_registry_getUniqueId. – Richard

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