Динамическая загрузка контента — HTML5 в порядке, Dojo — нет

У меня возникла ситуация, когда я динамически загружаю DIV с сервера с помощью dojo.xhrGet. Все в порядке. Содержимое возвращается нормально, и DIV вставляется на страницу нормально. Обратите внимание, что в этой ситуации я не могу знать, что DIV должен загружаться до того, как произойдет какое-либо другое событие.

Проблема, по-видимому, заключается в том, что виджеты DIJIT, содержащиеся в динамических DIV, являются не виджетами DIJIT, а обычными HTML-виджетами. То есть я могу работать с ними, используя "dojo.byId('widgetID')" и использовать стандартный JavaScript, но если я попробую "registry('widgetID')", я получу ответ "undefined".

Как я могу получить динамически загружаемый и иным образом декларативный код DIV для анализа в настоящие виджеты DIJIT?


person JMorgan    schedule 21.04.2016    source источник
comment
Виджеты DIJIT, содержащиеся в динамических DIV, не являются виджетами DIJIT. Пожалуйста, объясните подробнее.   -  person Himanshu    schedule 21.04.2016


Ответы (1)


Вам нужно использовать dojo/parser после того, как ваш div разметки был загружен в ваш DOM. Функция parse() преобразует вашу HTML-разметку из div в виджет dijit, если разметка оформлена должным образом.

Кстати, dojo.xhrGet устарел, и вместо него следует использовать dojo/request/xhr.

Ниже и пример с некоторым псевдокодом:

require(["dojo/request/xhr", "dojo/dom-construct"], function(xhr, domConstruct){
  xhr("example.json", {
    handleAs: "text" // or whatever
  }).then(function(data){
    // place your div to the dom (data is an html markup similar to this <input data-dojo-type="dijit/form/TextBox" type="text" name="dept1" />)
    var targetDom = 'targedDom';
    domConstruct.place(data, targetDom, 'replace');
    // trasform your div to a dijit widget 
    parser.parse(dojo.byId(targetDom)).then(function(){
        // after is parsed do smt here
    });

  }, function(err){
    // handle the error condition
  }, function(evt){
    // handle a progress event from the request if the browser supports XHR2
  });
});
person GibboK    schedule 21.04.2016
comment
Хорошо.. Позвольте мне немного переписать, чтобы заменить xhrGet, и выяснить, как двигаться дальше. Похоже, вы анализируете узел, в который помещается динамический контент. Поэтому, если я сейчас добавляю весь динамический контент в этот же узел, я буду повторно анализировать его снова и снова. Должен ли я вместо этого создавать какие-то пустые заполнители? - person JMorgan; 21.04.2016
comment
Спасибо за обновление для xhr, все работает. Разбор работает нормально до степени. Мне нужно было сначала создать пустой DIV, а затем добавить динамический контент в новый DIV, а затем проанализировать его. Сразу кажется, что все в порядке, потому что я вижу, что теперь это не заурядное текстовое поле HTML. Однако, когда я ввожу текст в поле, заполнитель не исчезает. Также сложно, если не невозможно, заставить текстовое поле получить фокус. Иногда я просто не могу нажать на поле. - person JMorgan; 21.04.2016
comment
Догадаться. Либо все ДОДЗЁ, либо ничего. На самом деле я просто добавлял innerHTML с динамическим содержимым, а затем анализировал его. Судя по всему, это сработало, но вызвало проблемы, упомянутые выше. Я переключился на использование domConstruct.place, и волшебство! - person JMorgan; 21.04.2016
comment
@JMorgan Я рад, что это помогло :) - person GibboK; 21.04.2016