繁体   English   中英

如何在Dojo JavaScript中注销或重新注册窗口小部件

[英]How to unregister or re-register a widget in a dojo javascript

我有一个应用程序是两个组合框。 根据第一个组合框中的值,第二个框将自动填充一些数据。 如果用户仅选择第一个框中的三个值(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(这是将第二个小部件ID更改为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

我该怎么做才能解决这个问题? 有没有一种方法可以检查小部件是否已通过ID注册,然后再次指向该小部件而不是制作一个新的小部件?

您可以使用dijit.byId()来检查是否存在带有ID的小部件。 例如:

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];
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM