2009-07-20 1 views
0

Ich verwende Dojo 1.3.1, im Wesentlichen unter FF3.5 für jetzt.Ziehen dnd Elemente generiert "this.manager.nodes [i] ist null"

Ich habe eine dnd Quelle, die auch ein Ziel ist. Ich programmiere programmatisch einige Knoten darin, indem ich Vorlagenelemente kloniere. Das Ziel für den Benutzer ist dann, dnd zu verwenden, um die Artikel zu bestellen. Es ist in Ordnung für ein oder zwei Aktionen, dann habe ich den Fehler "this.manager.nodes [i] ist null" in Firebug, dann wird keine dnd-Aktion mehr berücksichtigt.

Mein HTML (jsp), teilweise:

<div id="templates" style="display:none"> 
<div class="dojoDndItem action" id="${act.name}Template"> 
<fieldset> 
    <legend class="dojoDndHandle" >${act.name}</legend> 
    <input id="${act.name}.${parm.code}." type="text" style="${parm.style}" 
    dojoTypeMod="dijit.form.ValidationTextBox" 
    /><br> 
</fieldset></div> 
</div> 

Mein Javascript für das Hinzufügen/Entfernen dnd Artikel Knoten, Teil:

function addActionFromTemplate(/* String */actionToCreate, /* Object */data) { 
    // value of actionToCreate is template id 
    var node = dojo.byId(actionToCreate + "Template"); 
    if (node) { 
     var actNode = node.cloneNode(true); 

     // make template id unique 
     actNode.id = dojo.dnd.getUniqueId(); 

     // rename inputs (add the action nb at the end of id) 
     // and position dojo type (avoid double parsing) 
     dojo.query("input[type=text], select", actNode).forEach(function(input) { 
      input.id = input.id + actionsCount; 
      dojo.attr(input, "name", input.id); 
      dojo.attr(input, "dojoType", dojo.attr(input, "dojoTypeMod")); 
      dojo.removeAttr(input, "dojoTypeMod"); 
     }); 

     // insert the action at script's tail 
     actionList.insertNodes(true, [ actNode ]); 

     dojo.parser.parse(actNode); 

     // prepare for next add 
     actionsCount++; 
    } 
} 

function deleteAction(node) { 
    var cont = getContainerClass(node, "action"); 
    // remove the fieldset action 
    cont.parentNode.removeChild(cont); 
} 

Dank für die Hilfe ...

+0

Was Sie haben, sieht gut aus. Rufen Sie sync() in der dojo.dnd.Source auf, nachdem Sie Elemente hinzugefügt/entfernt haben? Kannst du den HTML-Code für deine Quelle veröffentlichen? – seth

+0

Danke für deinen Kommentar, seth. Glaubst du, dass das Aufrufen von sync() besser wäre? Ich dachte, Parsing wäre genug. Die HTML-Quelle ist riesig: als ich herausgefunden habe, dass "insertNodes (false ..." zu reparieren scheint, brauchen Sie es wirklich? – user140140

+0

Wenn Sie die Source-Methoden direkt aufrufen, müssen Sie nicht anrufen sync. Wenn Sie den DOM-Knoten unter Quelle außerhalb der Quelle manipulieren, sollten Sie die Synchronisationsmethode aufrufen: – seth

Antwort

0

OK, es scheint, dass schließlich, einfach zu verwenden:

actionList.insertNodes(false, [ actNode ]); 

statt

actionList.insertNodes(true, [ actNode ]); 

fixiert das pb.