2011-01-07 17 views
8

द्वारा सभी विगेट्स को नष्ट करें मेरी सामग्री को AJAX के साथ बदल दिया गया है लेकिन कभी-कभी एक तत्व के दो पृष्ठों पर एक ही आईडी होगी (यानी, होम पेज पर एक फोटो गैलरी पेज पर एक ही आईडी है)। इसका मतलब यह है कि जब dojo.parser.parse कहा जाता है, विगेट्स फिर से जोड़े जाने के लिए कोशिश कर रहे हैं, और नीचे त्रुटि फेंक दिया जाता है:डोजो: डोम नोड

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

आदर्श रूप में, मुझे क्या करना चाहते हैं, उसके destroyRecursive चलाया जाता है डीओएम नोड कि AJAX बदलता है। मैं नीचे लेकिन न तो काम के दोनों की कोशिश की है (मेरा मानना ​​है कि destroyRecursive विगेट्स नहीं डोम के लिए है?):

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

वहाँ ऐसा करने का एक अच्छा तरीका है, या मैं कोशिश करते हैं और है कि यह सुनिश्चित करने की आवश्यकता है सब मेरी आईडी अलग हैं?

उत्तर

22

आप सही रास्ते पर हैं, और आप सही हैं कि नष्ट करें केवल विजेट पर मौजूद है। हालांकि, आप जो करना चाहते हैं उसे पूरा करने के लिए कुछ विकल्प हैं।

यदि आप एक महत्वपूर्ण हद तक विजेट का उपयोग कर रहे हैं, और प्रश्न में div नियमित रूप से विगेट्स सहित सामग्री रखने के लिए बाल्टी के रूप में उपयोग किया जा रहा है, तो मैं अत्यधिक अनुशंसा करता हूं कि आपको dijit.layout.ContentPane पर एक नज़र डालें। ContentPane मुख्य रूप से एक कंटेनर के विचार के आसपास केंद्रित होता है जो सामग्री प्राप्त करता है, या तो सीधे या यूआरएल से, जिसमें विजेट शामिल हो सकते हैं या नहीं।

अभी आप शायद प्रत्येक पृष्ठ परिवर्तन पर कुछ इस तरह कर रहे हैं:

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

एक contentPane के साथ, आप इस तरह एक ही बात कर सकता है:

cp.set('href', 'something.html'); //use attr instead of set if < dojo 1.5 
इस के साथ

, contentPane न केवल उस यूआरएल को लाएगा और इसकी सामग्री को पकड़ देगा - यह इसके भीतर किसी भी विजेट को भी पार्स करेगा - और उतना ही महत्वपूर्ण रूप से, यह अपनी सामग्री को प्रतिस्थापित करने से पहले स्वचालित रूप से किसी मौजूदा विजेट को नष्ट कर देगा।

आप डोजो दस्तावेज में इसके बारे में अधिक पढ़ सकते हैं:

वैकल्पिक रूप से, अगर आप एक विजेट का उपयोग अपनी सामग्री धारण करने के लिए की तरह नहीं लग रहा है, तो आप अपने div में विजेट्स के लिए देख सकते हैं और उन्हें खुद को नष्ट कर सकते हैं। यहाँ यह करने के लिए सबसे आसान तरीका है:

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

महान जवाब, धन्यवाद – Ashley

+0

+1 वास्तव में अच्छा उपयोग के मामले contentPane –

+2

के लिए एएमडी नोट: dojo.forEach - आयात सरणी के रूप में "डोजो/_base/सरणी", तो array.forEach का उपयोग कर | dijit.findWidgets - रजिस्ट्री का उपयोग करके "dijit/रजिस्ट्री" आयात करें। FindWidgets – Deejers

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

असल में, नोड का चयन ... आप विजेट वस्तु के रूप में dojo.byNode(node) का उपयोग करके मैप किया प्राप्त कर सकते हैं, और फिर destroyRecursive(true);

0

मैं एक ऐसी ही समस्या हल dijit.registry.remove ('idName') का उपयोग करके रजिस्ट्री से हटाकर सामग्री को समाप्त करने के बाद नष्ट करने के बाद रिकर्सिव (झूठी), इसे फिर से लोड करने से पहले।

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

यदि आपके पास किसी पृष्ठ पर एक से अधिक विजेट नष्ट होने हैं, तो निम्न समाधान मेरे लिए काम करता है।

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

    }); 
संबंधित मुद्दे