2009-10-19 7 views
2

J'ai une page qui lorsqu'un utilisateur clique sur un lien pour certains outils de reporting, il leur demande d'abord d'entrer quelques paramètres de rapport. Je reçois la boîte de dialogue des paramètres sous la forme AJAX, en fonction de l'identifiant du lien. Chaque boîte de dialogue a des commandes de dojo, donc je dois les analyser lorsque la boîte de dialogue apparaît, car elle ne fait pas partie de la page.dojo.parser.parse ne fonctionne que la première fois il est appelé

La première boîte de dialogue à l'appel fonctionne correctement, mais les appels suivants aux boîtes de dialogue ne parviennent pas à analyser les commandes dojo.

Exemple:

showParametersDialog : function(doc) { 
    var content = doc.firstChild.firstChild.data; 
    var container = document.createElement('div'); 
    container.id = 'dialog'; 
    container.innerHTML = content; 
    container.style.background = 'transparent'; 
    container.style.position = 'absolute'; 
    container.style.top = (document.body.clientHeight/2) - 124 + "px"; 
    container.style.left = (document.body.clientWidth/2) - 133 + "px"; 
    container.style.display = 'block'; 
    document.body.appendChild(container); 

    // set up date fields 
    var date_from = dojo.byId('date_from'); 
    var date_to = dojo.byId('date_to'); 
    try { 
     date_from.value = dojo.date.locale.format(new Date(), {selector: 'date'}); 
     date_to.value = dojo.date.locale.format(new Date(), {selector: 'date'}); 
    } catch(e) { 
     var now = new Date(); 
     date_from.value = String(now.getMonth() + "/" + now.getDate() + "/" + now.getFullYear()); 
     date_to.value = String(now.getMonth() + "/" + now.getDate() + "/" + now.getFullYear()); 
    } 
    dojo.parser.parse(); 
    } 

Tous les dialogues ont les champs de date commune. Donc quand j'appelle cette boîte de dialogue la première fois, et que dojo.parser.parse() est appelé, il analyse les contrôles sur le dialogue, mais seulement la première fois ... après, pas de dojo.

Des pensées?

Merci, Paul.

+0

Ok, j'ai essayé d'utiliser: liste var = dojo.query ('[widgetId]', 'dialogue'); list.forEach ( fonction \t (w) { \t \t w.destroyRecursive(); }); ... pour détruire les widgets lorsque la boîte de dialogue est fermée et que l'erreur "L'objet ne supporte pas cette méthode" !!! Quelle? Bien sûr, cela supporte cette méthode, c'est dans les docs! Je commence à penser que l'utilisation de Dojo était un mauvais choix car cela me coûte maintenant du temps de développement. J'ai essayé l'exemple du site Web et ils ne fonctionnent tout simplement pas. J'utilise 1.3.2 Aide? Merci! – CrazyMerlin

+0

Au lieu de détruire récursif, vous pouvez aussi essayer d'utiliser un appel à dojo.query() pour récupérer n'importe quoi avec un "_widgetId" dans votre boîte de dialogue, puis détruire chacun individuellement. – Glenn

+0

Merci, mais j'ai essayé cela avec ce code: dojo.query ('[widgetId]', 'dialog'). ForEach (fonction (w) {w.destroy();}); Chaque fois que j'utilise détruire ou détruireRecursive je reçois la même chose "Méthode non supportée". Et parce que la liste ne contenait que des widgets réels, cela n'a aucun sens. Chacun devrait avoir une destruction, mais le système dit non.Cela n'a tout simplement pas de sens. – CrazyMerlin

Répondre

0

ce n'est pas que ce n'est pas l'analyse la deuxième fois, c'est que si dojo essaie d'analyser quelque chose plus d'une fois, il échoue. Vous pouvez garder une trace avec un drapeau booléen s'il a déjà été analysé, et sinon, passez la ligne qui l'analyse.

if (!parsed) 
{ 
    dojo.parser.parse(); 
} 
0

Cela pourrait être parce que vous manquez quelque chose comme dojo.parser.parse(container). Sinon, il essaie probablement d'analyser le document entier et trouve analysé par éléments et s'arrête.

(conjecture sauvage tiré de la vieille connaissance du dojo)

+0

Voici le problème que je reçois encore: Lorsque la boîte de dialogue est supprimé du DOM, puis ré-ajouté après avoir cliqué sur le lien une deuxième fois, je reçois "J'ai essayé d'enregistrer widget avec id = = date_from mais cet identifiant est déjà enregistré. "Alors comment détruire le noeud dojo correctement pour que je puisse le réutiliser? Merci – CrazyMerlin

+0

Il y a une fonction" détruire "que vous devez appeler quand vous voulez enlever un widget et c'est – Glenn

+0

Aucune des réponses à cette question n'est concluante, je peux être témoin du même comportement, sauf que c'est un peu plus aléatoire que ça. –

1

Vous pouvez utiliser

dojo.parser.instantiate([dojo.byId("myDiv")]); 

au lieu de dojo.parser.parse(); Utilisez-le sur tous les objets non analysés.

En savoir plus sur ce que vous pouvez trouver ici:

http://livedocs.dojotoolkit.org/dojo/parser

Questions connexes