Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在DojoJavaScript中注销或重新注册小部件_Javascript_Prototype_Dojo_Widget - Fatal编程技术网

如何在DojoJavaScript中注销或重新注册小部件

如何在DojoJavaScript中注销或重新注册小部件,javascript,prototype,dojo,widget,Javascript,Prototype,Dojo,Widget,我有一个应用程序是两个组合框。根据第一个组合框中的值,第二个框会自动填充一些数据。如果用户只在第一个框(技能、工具、客户机)中选择三个值中的一个,则此操作很好,但如果用户选择一个值,然后将其更改回原始值,则会收到如下消息: Tried to register widget with id==expandableQueryList0.skill.name but that id is already registered 问题是,为了构建查询,我需要能够在以后找到这些值,我已经在动态构建组合框,

我有一个应用程序是两个组合框。根据第一个组合框中的值,第二个框会自动填充一些数据。如果用户只在第一个框(技能、工具、客户机)中选择三个值中的一个,则此操作很好,但如果用户选择一个值,然后将其更改回原始值,则会收到如下消息:

Tried to register widget with id==expandableQueryList0.skill.name but that id is already registered
问题是,为了构建查询,我需要能够在以后找到这些值,我已经在动态构建组合框,在本例中,expandableQueryList0.skill.name是动态生成的名称。如果他们选择了工具,它将得到expandableQueryList0.tool.name,然后将组合框更改回Skill(这是第二个widgets 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.
}
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];
    }
}
dojo.parser.parse()
的返回值是在解析过程中创建的所有小部件的数组。因此,您可以保留创建的小部件的引用,并使用该引用进行检查。例如:

if (!dijit.byId(divIdName)) {
     //create the widget.
}
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];
    }
}

这是一种方法,但是如果我不想跟踪已经创建的小部件,我该如何删除旧的小部件,以便使用相同的ID创建新的小部件?可能吗?dojo.foreach(widgets)递归循环的各种版本都有,但我仍然有同样的问题。在我的例子中,小部件的名称是混乱和不可预测的。我不能告诉parse删除并重新注册吗?