Вы на правильном пути, и вы правы, что destroyRecursive существует только в виджетах. Тем не менее, есть несколько вариантов, чтобы выполнить то, что вы хотите сделать.
Если вы используете виджеты в значительной степени, а вопрос, который находится в вопросе, регулярно используется в качестве ведра для хранения содержимого, включая виджеты, то я настоятельно рекомендую вам взглянуть на dijit.layout.ContentPane
. ContentPane - это виджет, в первую очередь ориентированный на идею контейнера, который получает контент, либо напрямую, либо из URL-адреса, который может включать или не включать виджеты.
Прямо сейчас вы, вероятно, делать что-то вроде этого на каждой смене страницы:
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 будет не только извлекать этот URL-адрес и содержать его содержимое - он также будет анализировать любые виджеты внутри него - и, что не менее важно, он автоматически уничтожит любые существующие виджеты внутри себя, прежде чем он заменит его содержимое.
Вы можете прочитать об этом в документации Dojo:
В качестве альтернативы, если вы не чувствуете, как с помощью виджета, чтобы держать ваше содержание, вы могут искать виджеты в вашем div и уничтожать их самостоятельно. Вот самый простой способ сделать это:
dojo.forEach(dijit.findWidgets(dojo.byId('main')), function(w) {
w.destroyRecursive();
});
Великий ответ, спасибо – Ashley
+1 действительно хороший случай использования для ContentPane –
отмечает AMD: dojo.forEach - импорт "додзё/_Образы базовой/массив" в виде массива, а затем с помощью array.forEach | dijit.findWidgets - импортировать «dijit/registry», а затем использовать registry.findWidgets – Deejers