Виджеты 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
где вам нужен виджет