Проблема с JS при загрузке контента через AJAX в Yii-фреймворке?

Есть следующий код:
echo CHtml::ajaxLink(
				$title,
				array('controller/action', 'id' => $id),
				array(
					'success' => 'js:function(data) {$("#container").html(data);}',
				)
			);


В controller/action вызывается
$this->renderPartial('view', array('model' => $model), false, true);


Если убрать $processOutput = true, то те скрипты, что вызываются в view - не работают. Например, не работает виджет TbEditableField (yii-booster). Если оставить - после вызова ajax, частично падают те, что уже есть на изначальной странице.

Вопрос: можно ли как-то решить эту проблему?
  • Вопрос задан
  • 7351 просмотр
Пригласить эксперта
Ответы на вопрос 4
@sets

А вы выясните, почему падают те, что есть на изначальной странице? Я в таких случаях пользуюсь $processOutput = true и доволен. Проблемы возникают двух типов. Во-первых, могу повторно тянуться какие-нибудь js из assets. Для этого в подгружаемой вью укажите, что некоторые вещи грузить не надо, они в материнской странице уже есть. Типа

Yii::app()->clientscript->scriptMap['jquery.min.js'] = false;


Другая проблема - совпадение id. Yii для всяческого манипулирования навешивает на каждый виджет id автоматом, если их не указывать. На одной странице они нумеруются, благодаря чему все разные, а вот подгружаемые нумеруются заново, в итоге на одной странице оказываются несколько div id=yw0, например, и разные обработчики на этот самый yw0. Указывайте хотя бы подгружаемым виджетам id сами.

Ответ написан
Комментировать

Тоже маялся этим вопросом и переписал события ручками в js-файликах, мне жутко не нравилось описание аякс-линка на половину страницы да еще и во вьюшке, но что еще можно и нужно посмотреть это : http://www.yiiframework.com/doc/api/1.1/CHtml#clientChange-detail http://www.yiiframework.com/doc/api/1.1/CHtml#liveEvents-detail

обратить внимание на опцию live, она как раз для делегирования событий

Ответ написан
@DuD
В базовом классе для всех контроллеров можно сделать примерно так. Отключив ненужные вам скрипты.
if (Yii::app()->request->isAjaxRequest)
{
    $cs = Yii::app()->clientScript;
    $cs->scriptMap = array(
        'jquery.js' => false,
        'jquery-ui.min.js' => false,
        'jquery-ui.css' => false,
    );
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы