我有一个应用程序是两个组合框。根据第一个组合框中的值,第二个框会自动填充一些数据。如果用户只选择第一个框(技能,工具,客户端)中的三个值中的一个,这可以正常工作,但如果用户选择一个值,然后将其更改回原始值,我会得到如下消息:< / p>
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注册,然后再指向那个小部件而不是新的小部件?
答案 0 :(得分: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];
}
}