2010-07-09 2 views
2

У меня есть этот бит кода. Он используется для обновления формы после изменения элемента select. onChange выполняется вызов «ajax», и этот бит кода отвечает за ответ.dojo.parser.parse не всегда возвращает

В первый раз все работает так, как ожидалось. Однако dojo.parser.parse не может вернуться примерно в 50% случаев.

Сначала это выглядело так:

var targetNode = dojo.byId(node); 
targetNode.innerHTML = data; 
dojo.parser.parse(targetNode); 

Тогда я что-то об объектах существующих читать. Поэтому я подумал, что, возможно, их уничтожение поможет:

if(dojo.byId(node)) dojo.destroy(node); 
dojo.create('div', { id: node }, afternode, 'after'); 
var targetNode = dojo.byId(node); 
targetNode.innerHTML = data; 
dojo.parser.parse(targetNode); 

Это не помогло. Что происходит? Иногда он разбирает некоторые элементы. Это известная проблема с dojo.parser?

ответ

4

Если вы создаете диджиты декларативно и используете dojo.parser.parse, чтобы проанализировать их на лету, и вы укажете ID диджета, как только вы разобьете один и тот же фрагмент HTML дважды, вы получите сообщение об ошибке, указывающее, что идентификатор dijit была зарегистрирована.

<div dojoType="dijit.form.Button" id="myButton" /> 

Причина в том, что диджиты еще не были уничтожены, и вы не можете повторно использовать идентификатор. Если вы не укажете ID при его объявлении, вы не получите эту ошибку, но на самом деле у вас есть утечки памяти.

Правильный способ состоит в том, чтобы уничтожить диджиты перед повторным анализом фрагмента HTML. Возвращаемое значение dijit.parser.parse - это список массивов, содержащий ссылки всех диджитов, которые он анализировал из фрагмента HTML. Вы можете сохранить список и уничтожить диджиты в первую очередь.

if (dijits) { 
    for (var i = 0, n = dijits.length; i < n; i++) { 
     dijits[i].destroyRecursive(); 
    } 
} 
dijits = dojo.parser.parse(targetNode); 
+0

Так что, я думаю, мне нужно будет сохранить список разобранных диджитов для уничтожения позже в глобальном массиве? –

+0

Не обязательно в глобальном масштабе, выберите область, подходящую для вас. Вы также можете использовать 'dijit.findWidgets', чтобы найти диджиты в узле DOM и уничтожить их. Например, 'var dijits = dijit.findWidgets (targetNode); // уничтожить диджиты' –

+0

Человек, это фантастика! Спасибо за вашу помощь! Я ничего не знаю о додзе. Я думал, что могу просто сделать node.empty или, может быть, node.destroyRecursive. Но это не работает, как я ожидал. Это потому, что узлы зарегистрированы в памяти как объект додзё, который сам додзё знает? Итак, node.empty, избавляется от узла в DOM, но не додзе-объект в памяти? –

Смежные вопросы