2010-12-09 41 views
1

我有一个应用程序是两个组合框。根据第一个组合框中的值,第二个框会自动填充一些数据。如果用户只选择第一个框中的三个值之一(技巧,工具,客户端),这可以正常工作,但如果用户选择一个值,然后将其更改回原始值,我会收到如下消息:如何注销或重新注册一个道场的小部件javascript

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

    } 

所以,你可以看到,我在清理出保存在问题ComboBox中DIV一些尝试。此功能被称为onChange

我能做些什么来解决这个问题?有没有办法检查一个小部件是否已经被ID注册过,然后再次指向那个小部件而不是创建一个小部件?

+0

dojo.foreach(小部件)destroyRecursive循环的各种版本都在,但我仍然有同样的问题。在我的情况下,这些小部件的名称已经变得不可预知了。我不能告诉解析放弃和重新注册吗? – 2013-01-03 05:27:57

回答

0

您可以使用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]; 
    } 
} 
+0

这是一种解决这个问题的方法,但是如果我不想跟踪哪些小部件已经创建完成,那么我将如何去删除旧的小部件,以便可以使用相同的ID创建新小部件?可能吗? – Derek 2010-12-09 17:34:07