Как отменить регистрацию или перерегистрировать виджет в додзё javascript - PullRequest
1 голос
/ 09 декабря 2010

У меня есть приложение, которое представляет собой два поля со списком. В зависимости от значения в первом поле со списком, второе поле автоматически заполняется некоторыми данными. Это работает нормально, если пользователь выбирает только одно из трех значений в первом поле (Skill, Tool, Client), но если пользователь выбирает одно значение, а затем изменяет его на исходное значение, я получаю сообщение, подобное этому:

Tried to register widget with id==expandableQueryList0.skill.name but that id is already registered

Проблема в том, что мне нужно иметь возможность найти эти значения позже для целей построения запроса, и я уже динамически создаю поля со списком, и в этом примере expandableQueryList0.skill.name было динамически генерируемым именем. Если бы они выбрали инструмент, он получил бы expandableQueryList0.tool.name, а затем изменил комбобокс обратно на Skill (а это идентификатор 2-го виджета на expandableQueryList0.skill.name) - вот что дает мне ошибку.

вот код:

   function setVal(value, table, paramCount, offset) {

       if(((value == 'Skills') || (value == 'Tools')|| (value == 'Clients') ) ){
       var row_template = "";
            if(value == 'Skills'){
               row_template = $('skillbox_template');
            }else if(value == 'Tools'){
               row_template = $('toolbox_template');
            }else{
               row_template = $('clientbox_template');
            }

            var t = new Template(row_template.text);
            var evaledTemplate = t.evaluate({qIdx:paramCount});

            var valID = "expandableQueryList[" + (paramCount) + "].valBox";//sets the valID
            var widgets = dijit.findWidgets(valID);
            dojo.forEach(widgets, function(w) {
                w.destroyRecursive(true);
            });

            var ni = document.getElementById(valID);//finds the valID in the evaledTemplate
            //create a new div to hold the new search box

            var divIdName = "my"+(paramCount)+"Div";
            var newdiv = document.createElement('div');
            newdiv.setAttribute("id",divIdName);
            newdiv.innerHTML = evaledTemplate;
            dojo.empty(ni);
            ni.appendChild(newdiv);
            dojo.parser.parse(newdiv);
        }

   }

Итак, как вы можете видеть, у меня есть некоторая попытка очистить DIV, который содержит рассматриваемый комбинированный список. Эта функция называется onChange

Что я могу сделать, чтобы решить эту проблему? Есть ли способ проверить, зарегистрирован ли виджет уже по идентификатору, а затем просто указать на него еще раз вместо создания нового?

1 Ответ

0 голосов
/ 09 декабря 2010

Вы можете использовать dijit.byId(), чтобы проверить, существует ли виджет с идентификатором. Например:

if (!dijit.byId(divIdName)) {
     //create the widget.
}

Возвращаемое значение dojo.parser.parse() - это массив всех виджетов, созданных при разборе. Таким образом, вы можете сохранить ссылку на созданный виджет и использовать эту ссылку для проверки. Например:

var widgets = {};
function setVal(value, table, paramCount, offset) {
    if (widgets[paramCount]) {
         //skip the creation
    }
    else {
         //create the widget
         widgets[paramCount] = dojo.parser.parse(newdiv)[0];
    }
}
...