2011-01-07 18 views
8

Mi contenido se reemplaza por ajax pero a veces un elemento tendrá el mismo ID en dos páginas (es decir, una foto en la página de inicio tiene el mismo ID en la página de la galería). Esto significa que cuando se llama dojo.parser.parse, los widgets están tratando de volver a agregar, y el error a continuación se lanza:dojo: destruir todos los widgets por nodo dom

Error: Tried to register widget with id==____ but that id is already registered 

Idealmente, lo que me gustaría hacer es correr en la destroyRecursive Nodo DOM que reemplaza AJAX. He intentado tanto de la continuación, pero no trabajan (creo destroyRecursive es para los widgets no DOM?):

dojo.byId('main').destroyRecursive(); 
dijit.byId('main').destroyRecursive(); 

¿Hay una buena manera de hacer esto, o tengo que tratar de asegurar que toda mi Los identificadores son diferentes?

Respuesta

22

Estás en el camino correcto, y tienes razón de que destroyRecursive solo existe en los widgets. Sin embargo, hay un par de opciones para lograr lo que quieres hacer.

Si está utilizando widgets en gran medida, y el div en cuestión se usa regularmente como un depósito para contener contenido, incluidos widgets, entonces le recomiendo que consulte dijit.layout.ContentPane. ContentPane es un widget centrado principalmente en la idea de un contenedor que recibe contenido, ya sea directamente o desde una URL, que puede o no incluir widgets.

En este momento usted está probablemente haciendo algo como esto en cada cambio de página:

dojo.xhrGet({ 
    url: 'something.html', 
    load: function(html) { 
     dojo.byId('main').innerHTML = html; 
     dojo.parser.parse(dojo.byId('main')); 
    } 
    error: function(error) { ... } 
}); 

Con un ContentPane, se puede hacer la misma cosa como esta:

cp.set('href', 'something.html'); //use attr instead of set if < dojo 1.5 

Con esto, ContentPane no solo buscará esa URL y mantendrá su contenido, sino que también analizará los widgets que contiene, y lo que es igualmente importante, destruirá automáticamente todos los widgets existentes antes de que reemplace su contenido.

Usted puede leer más sobre esto en la documentación Dojo:

Alternativamente, si usted no se siente como el uso de un widget para mantener su contenido, puede buscar widgets en su div y destruirlos usted mismo. Esta es la forma más fácil de hacerlo:

dojo.forEach(dijit.findWidgets(dojo.byId('main')), function(w) { 
    w.destroyRecursive(); 
}); 
+0

respuesta Muy bien, gracias – Ashley

+0

1 muy buen caso de uso para ContentPane –

+2

AMD Notas: dojo.forEach - importación "dojo/_Base/matriz" como una matriz, a continuación, utilizando array.forEach | dijit.findWidgets - importa "dijit/registry" y luego usa registry.findWidgets – Deejers

4
dojo.query('selector').forEach(function(node){ 
    dijit.byNode(node).destroyRecursive(true); 
}); 

Básicamente, seleccionando el nodo ... se puede obtener el mapeado como objeto del widget usando dojo.byNode(node), y luego destroyRecursive(true);

0

I resuelto un problema similar , simplemente eliminando del registro usando dijit.registry.remove ('idName') después de eliminar el contenido con destroyRecursive (falso), antes de volverlo a cargar.

if(typeof registry.byId("tableOfContents") != "undefined"){ 
     registry.byId("tableOfContents").destroyRecursive(false); 
     dijit.registry.remove('tableOfContents'); 
    } 
0

Si tiene que destruir más de un widget en una página, la siguiente solución funciona para mí.

var widg = dijit.findWidgets(dojo.byId('root-id')); // root-id is top div id which encloses all widgets 
$(widg).each(function(){ 

    dijit.byId($(this).attr("id")).destroy(true); 

    }); 
Cuestiones relacionadas