2011-01-07 7 views
8

Moje treści są zastępowane przez ajax, ale czasami element będzie miał ten sam identyfikator na dwóch stronach (np. Zdjęcie na stronie głównej ma ten sam identyfikator na stronie galerii). Oznacza to, że gdy dojo.parser.parse nazywa, widgety próbują być ponownie dodany, a poniżej zostanie zgłoszony błąd:dojo: niszcz wszystkie widżety według węzła dom.

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

Idealnie, co chciałbym zrobić, to uruchomić destroyRecursive na Węzeł DOM, który zastępuje AJAX. Próbowałem zarówno z dołu, ale ani pracy (wierzę destroyRecursive jest dla widżetów nie DOM):

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

Czy istnieje dobry sposób to zrobić, czy trzeba spróbować i upewnić się, że wszystkie moje id są różne?

Odpowiedz

22

Jesteś na dobrej drodze i masz rację, że destroyRecursive istnieje tylko w widżetach. Istnieje jednak kilka opcji do wykonania tego, co chcesz zrobić.

Jeśli używasz widżetów w znacznym stopniu, a dany element div jest regularnie używany jako zasobnik do przechowywania treści, w tym widżetów, to bardzo polecam zapoznać się z dijit.layout.ContentPane. ContentPane to widżet skupiający się przede wszystkim na idei kontenera, który otrzymuje treść bezpośrednio lub z adresu URL, który może zawierać widżety lub nie.

Teraz jesteś prawdopodobnie robi coś takiego na każdej zmianie strony:

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

z ContentPane, można zrobić to samo tak:

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

z tym, ContentPane nie tylko pobierze ten URL i zatrzyma jego zawartość - będzie również analizować wszelkie widżety w nim - i równie ważne, automatycznie zniszczy wszelkie istniejące widżety w sobie, zanim zastąpi jego treść.

Możesz przeczytać więcej na ten temat w dokumentacji Dojo:

Ewentualnie, jeśli nie czujesz się jak za pomocą widgetu trzymać treści, może szukać widgetów w twoim dziale i sam je niszczyć. Oto najprostszy sposób to zrobić:

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

Wielkie odpowiedź, dzięki – Ashley

+0

+1 naprawdę dobry przypadek użycia dla ContentPane –

+2

AMD Uwagi: dojo.forEach - import "dojo/_base/array" jako tablicę, a następnie za pomocą array.forEach | dijit.findWidgets - import "dijit/registry" następnie przy użyciu rejestru.findWidgets – Deejers

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

Zasadniczo, wybierając węzeł ... Można dostać zmapowany jako obiektu widget za pomocą dojo.byNode(node), a następnie destroyRecursive(true);

0

I rozwiązać podobny problem , po prostu usunięcie z rejestru przy użyciu dijit.registry.remove ("idName") po usunięciu treści za pomocą destroyRecursive (false), przed ponownym załadowaniem.

0

Jeśli masz więcej niż jeden widżet do zniszczenia na stronie, poniższe rozwiązanie działa dla mnie.

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

    }); 
Powiązane problemy