2010-12-09 6 views
1

Ich habe eine Anwendung, die zwei Kombinationsfelder ist. Abhängig vom Wert im ersten Kombinationsfeld wird das zweite Feld automatisch mit einigen Daten gefüllt. Dies funktioniert gut, wenn der Benutzer nur einen der drei Werte in der ersten Box (Skill, Tool, Client) auswählt, aber wenn der Benutzer einen Wert auswählt und dann wieder auf den ursprünglichen Wert zurückstellt, bekomme ich eine Nachricht wie folgt:Wie melde ich ein Widget in einem Dojo Javascript

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

Das Problem ist, ich brauche, um diese Werte für die Zwecke später zu finden, eine Abfrage zu bauen, und ich bin schon dynamisch die Combo-Boxen bauen, und in diesem Beispiel war expandableQueryList0.skill.name die dynamisch generierter Name Wenn sie das Werkzeug auswählten, würde es expandableQueryList0.tool.name erhalten und dann die Combobox zurück zu Skill ändern (und dies ist die zweite Widgets-ID zu expandableQueryList0.skill.name) ist, was mir den Fehler gibt.

siehe den Code:

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

    } 

So, wie Sie sehen können, ich die DIV bei Ausräumen etwas Versuch haben, dass die Combobox in Frage hält. Diese Funktion wird aufgerufen onChange

Was kann ich tun, um dieses Problem zu lösen? Gibt es eine Möglichkeit, zu überprüfen, ob ein Widget bereits per ID registriert ist, und dann einfach auf dieses Widget zu zeigen, anstatt ein neues zu erstellen?

+0

Verschiedene revs der dojo.foreach (widgets) destroyRecursive Schleife sind um, aber ich habe immer noch das gleiche Problem. Die Widgetnamen sind in meinem Fall verstümmelt und unvorhersehbar. Kann ich Pars nicht sagen, dass es gelöscht und neu registriert werden soll? –

Antwort

0

Sie können dijit.byId() verwenden, um zu überprüfen, ob ein Widget mit der ID existiert. Zum Beispiel:

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

Der Rückgabewert von dojo.parser.parse() ist ein Array von all Widgets, die in dem Parsing erstellt. Sie können also eine Referenz des erstellten Widgets beibehalten und diese Referenz zur Überprüfung verwenden. Zum Beispiel:

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

Dies ist eine Möglichkeit, aber wenn ich nicht wissen möchte, welche Widgets bereits erstellt wurden, wie würde ich alte Widgets löschen, damit neue mit der gleichen ID erstellt werden können? ist es möglich? – Derek

Verwandte Themen