Виджеты Yii & Bootstrap не работают после второго Ajax

Для улучшения начальной загрузки страницы большая часть содержимого на странице, которую я создаю, загружается только при необходимости. Для этого я использую следующий код с помощью вызова ajax.

$this->renderPartial('_callhistory', array(
                        'modelCalls'=>$modelCalls,
                        'fid'=>$fid,                        
), false, true);

Это отлично работает, все виджеты работают. Это вызывает проблемы с дизайном основной темы, но на данный момент это не главная проблема.

У меня проблема в том, что иногда нужно снова вызвать ajax для обновления представления. чтобы сделать это, я вызываю точно такую ​​же функцию ajax с теми же параметрами, но при втором вызове все виджеты (а именно: TbSelect2 и CJuiDatePicker) перестают работать, вместо этого я получаю стандартный выбор и текстовое поле для даты. Это, в свою очередь, нарушает проверку на стороне клиента.

Другие вопросы и ответы .unbind()это путь? Если да, то правильно ли я говорю, что все элементы виджета необходимо отсоединить перед вызовом ajax?

Спасибо, я также опубликую свой Ajax, просто обратите внимание, что он обрабатывает все обновления, как этот.

function renderSectionView(fid, viewid, headerid, panelid, extraparams){
    var panel = $('#'+panelid);
    panel.html("<img src='images/ajax-loader-bar.gif' class='loadingbar' />");

    var param = {   'fid':fid,
            'viewid':viewid
            };  

    var url = controller_url_builder('SubViewAjax', param);

    var jqxhr = $.post( url, extraparams, function(data) {
        panel.html(data);
    })
    .done(function() {
        renderedlist.push(viewid+fid);
    })
    .fail(function() {
        panel.html("<span class='error'>There has been an error, please refresh the page and try again</span>");
    })
    .always(function() {
        scrollToAcc(headerid);
    });
}

1 ответ

Решение

Я наконец-то нашел ответ на этот вопрос здесь:

Yii Framework Forum: ajax и виджеты

Хитрость заключается в том, чтобы визуализировать виджет в вашем контроллере, но сохранить вывод как переменную следующим образом:

$html = $this->widget( $className,  $properties=array ( ), TRUE);

ПРИМЕЧАНИЕ. Последний "истинный" параметр позволяет поместить результат в $html переменная.

Затем визуализируйте ваши сценарии с помощью клиентского сценария.

Yii::app()->getClientScript()->renderBodyBegin($html);
Yii::app()->getClientScript()->renderBodyEnd($html);

Затем просто передайте переменную в представление (я делаю это через renderPartial) и используйте echo $html где вам нужен виджет

Другие вопросы по тегам