2014-01-07 2 views
0

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

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

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

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

Прочее Q & Как упоминается .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); 
    }); 
} 

ответ

0

Я наконец нашел ответ на это, благодаря здесь:

Yii Framework Forum: ajax and widgets

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

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

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

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

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

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

Смежные вопросы