парсинг dojoType для загруженного контента AJAX - PullRequest
4 голосов
/ 19 февраля 2010

Я получаю сообщение об ошибке при разборе флажков в таблице, загруженной с помощью AJAX, но я получаю сообщение об ошибке, говоря, что виджет с таким идентификатором уже зарегистрирован:
"Ошибка ('Попытка зарегистрировать виджет с идентификатором == userListUncheckAll, но этот идентификатор уже зарегистрирован')"

И я предполагаю, что это происходит, потому что мы вынимаем текущую таблицу, а затем заменяем ее на то, что когда-либо получаем от вызова AJAX, и, таким образом, идентификаторы элементов будут одинаковыми. Есть ли способ «отменить регистрацию» виджетов или что-то подобное?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2010

Я нашел ответ на этот вопрос сам, поэтому выложу его здесь для других:

Если у вас есть набор идентификаторов, которые, как вы знаете, должны быть «незарегистрированными», создайте массив имен идентификаторов:

try {
    dojo.parser.parse();
} catch (e) {
    var ids = ['id1', 'id2', 'id3'];
    dijit.registry.forEach(function(widget) {
        //remove this check if you want to unregister all widgets
        if (dojo.indexOf(ids, id) { 
            widget.destroyRecursive();
        }
    });
    dojo.parser.parse();
}

Работает как шарм.

1 голос
/ 02 августа 2012

Получите родительский узел, в который вы вставляете содержимое AJAX, и анализируйте ТОЛЬКО этот узел. Вы получаете эту ошибку, потому что другие виджеты в вашем DOM анализируются дважды. Примерно так:

require(["dojo/dom", "dojo/parser", "dojo/_base/xhr"/*, etc */ ], 
   function(dom, parser, xhr) {
      var request = xhr.get({
         // your details here
      });

      request.then(function(data) {
         // transform data if necessary
         var parentNode = dom.byId("/* parent id */");
         parentNode.innerHTML = data;

         // This is where the widgets get built!
         parser.parse(parentNode); // or parser.parse("/* parent id */");
      }, function(err) {
         // handle error
      });
});

Также убедитесь, что вы включили правильные модули dojo / dijit. Распространенная ошибка - забыть включить модули для виджетов, которые вы пытаетесь вставить. Например, если вы используете TabContainer, добавьте «dijit / layout / TabContainer» в список необходимых модулей.

0 голосов
/ 01 февраля 2013

В документацию Dojo Parser включен этот фрагмент кода:

dojo.xhrGet({
  url: "widgets.html",
  load: function(data){
    dojo.byId("container").innerHTML = data;
    dojo.parser.parse("container");
  }
})

Я применил свой код и работает нормально.

...