web2py определяет конец контроля загрузки после ajax - PullRequest
0 голосов
/ 09 июня 2018

Я работаю с web2py.

Я запускаю ajax-вызов и хочу обновить определенные значения selectbox из базы данных. Я вызываю контроллер и возвращаю selectbox с опциями, все создано успешно,

Я хотел бы преобразовать созданный / возвращенный блок выбора в выбранный блок выбора , как только он полностью загрузит , в противном случае он возвращается к обычному блоку выбора.

Я пытался:

  • Прослушивание 'DOMSubtreeModified' (и других подобных событий) и затем активация выбранных строк, но они запускаются слишком часто, и я должен знать, когда поле выбора свсе опции полностью инициированы .Я могу принудительно инициировать каждое изменение, это ужасно - потребляет много ресурсов и просто неправильно.
  • Инициирует некоторый обратный вызов при возврате ajax (событие 'ajax: complete'), но, опять же, это не гарантировать, что элементы управления html полностью инициированы, как указано в в этом ответе (и проверено).
  • Я попытался установить событие onload для элемента управления select.

Основные строки кода:

Вызов JavaScript:

ajax('{{=URL('controller_name', 'func_name')}}', ['param1'], 'target_div');

Возвращает контроллер Python (возвращает элемент управления select с объектами option, инициированными в нем, и переопределяетtarget_div inner html):

return SELECT(distinct_values, _id = 'manual_group_selectbox' , _multiple = 'true' , _class='SelectBoxSingleDisabled');

Ищете решение, ориентированное на web2py.Никакой грубой силы / хакерских вещей, если это возможноСпасибо!

1 Ответ

0 голосов
/ 09 июня 2018

Есть несколько опций (первые две предлагаются здесь ):

  1. В контроллере добавьте выбранный код инициализации в response.js - этобудет выполнено после добавления возвращенного HTML в DOM.

  2. Добавление кода инициализации Chosen к элементу сценария после элемента select:

    CAT(SELECT(distinct_values, _id = 'manual_group_selectbox' , _multiple = 'true' ,
               _class='SelectBoxSingleDisabled'),
        SCRIPT('[Chosen code]'))
    
  3. Третьим аргументом функции ajax() может быть функция Javascript, которая принимает данные, возвращаемые сервером.Таким образом, вы можете написать функцию, которая добавляет возвращенный HTML в DOM и затем инициализирует Chosen:

    ajax(
      '{{=URL('controller_name', 'func_name')}}', ['param1'],
      function(html) {
        [add html to DOM]
        [initialize Chosen]
      }
    );
    
  4. Установите обработчик события jQuery .ajaxSuccess(), который должен запускаться послеajax() функция обновляет DOM.

...