2010-07-09 6 views
2

J'ai ce bit de code. Il est utilisé pour mettre à jour le formulaire après la modification d'un élément select. onChange un appel "ajax" est fait et ce bit de code s'occupe de la réponse.dojo.parser.parse ne retourne pas toujours

La première fois que tout fonctionne comme prévu. Cependant, le dojo.parser.parse ne parvient pas à retourner environ 50% du temps.

Au début, il ressemblait à ceci:

var targetNode = dojo.byId(node); 
targetNode.innerHTML = data; 
dojo.parser.parse(targetNode); 

Alors je lis quelque chose sur les objets existants. Donc, je pensais que peut-être les détruire aiderait:

if(dojo.byId(node)) dojo.destroy(node); 
dojo.create('div', { id: node }, afternode, 'after'); 
var targetNode = dojo.byId(node); 
targetNode.innerHTML = data; 
dojo.parser.parse(targetNode); 

Cela n'a pas aidé. Que fait le h3ll? Parfois, il analyse certains des éléments. Est-ce un problème connu avec le dojo.parser?

Répondre

4

Si vous créez les dijits de façon déclarative et que vous utilisez dojo.parser.parse pour les analyser à la volée et que vous spécifiez l'ID du dijit, une fois que vous avez analysé deux fois le même fragment HTML, vous obtenez une erreur indiquant que l'ID de dijit a été enregistré. La cause en est que les dijits n'ont pas encore été détruits et que vous ne pouvez pas réutiliser l'ID. Si vous ne spécifiez pas l'ID lors de la déclaration, vous n'obtiendrez pas cette erreur, mais vous avez réellement des fuites de mémoire.

La méthode correcte consiste à détruire les dijits avant de réexécuter le fragment HTML. La valeur de retour de dijit.parser.parse est une liste de tableaux qui contient les références de tous les dijits analysés à partir du fragment HTML. Vous pouvez garder la liste et détruire les dijits en premier.

if (dijits) { 
    for (var i = 0, n = dijits.length; i < n; i++) { 
     dijits[i].destroyRecursive(); 
    } 
} 
dijits = dojo.parser.parse(targetNode); 
+0

Donc je suppose que je devrais garder la liste des dijits analysés à détruire plus tard dans un tableau global? –

+0

Pas nécessairement dans la portée globale, choisissez la portée qui vous convient. Vous pouvez également utiliser 'dijit.findWidgets' pour trouver les dijits dans un noeud DOM et les détruire. Par exemple, 'var dijits = dijit.findWidgets (targetNode); // détruis les dijits –

+0

L'homme, c'est fantastique! Merci de votre aide! Je ne sais rien du dojo. Je pensais que je pouvais juste faire un node.empty ou peut-être node.destroyRecursive. Mais ça ne marche pas comme je m'y attendais. Est-ce parce que les noeuds sont enregistrés en mémoire sous la forme d'un objet dojo dont le dojo lui-même est conscient? Ainsi, node.empty, se débarrasse du noeud dans le DOM, mais pas l'objet dojo en mémoire? –

Questions connexes