Клонирование DOM-узлов с дижитами внутри может быть немного сложнее. Функция dojo.clone
будет клонировать DOM-узлы dijits, но не будет выполнять вызовы к dojo.connect
, зарегистрировать его в реестре dijit и так далее. Вы получите коробки, которые выглядят как диджиты, но не работают. Считайте, что это похоже на фотокопирование буклета, но не сшивание страниц вместе.
Лучше всего сделать клон myDiv до того, как парсер Dojo проанализирует его. Это означает, что вы не можете установить для parseOnLoad значение true в вашей конфигурации Dojo.
Например, создайте клон и сохраните его где-нибудь в dojo.ready
и запустите парсер вручную в конце:
var clonableDiv,
numClones = 0;
dojo.ready(function()
{
clonableDiv = dojo.clone( dojo.byId("myId") );
dojo.parser.parse();
});
Теперь предположим, что у вас есть кнопка с идентификатором «myButton», используемая для добавления клонов в форму:
dojo.connect("myButton", "onclick", function()
{
var newClone = dojo.clone(clonableDiv);
newClone.setAttribute("id", "myId_" + numClones);
newClone.childNodes[1].setAttribute("data-dojo-props", "name: 'aName_" + numClones + "'");
dojo.place(newClone, dojo.byId("myId"), "after");
numClones++;
dojo.parser.parse(newClone);
});
Здесь есть несколько вещей, на которые стоит обратить внимание. Во-первых, вы должны убедиться, что вы не вставили дубликат идентификатора в документ. То же самое касается атрибутов имени входных полей. Кроме того, после того, как вы вставили клон, вам нужно явно проанализировать новый вставленный div.
Это немного запутанно, особенно если у вас есть несколько узлов или виджетов с идентификаторами или именами, которые вы должны убедиться, что они уникальны. В какой-то момент может быть так же аккуратно собрать все программно, а не клонировать myId. Кроме того, вы можете создать собственный виджет для повторяемой области.