Виджеты в динамически загружаемом контенте

Ребята, нужна помощь.

Суть такая: есть страница с блоками данных. Каждый блок — форма, загружаемая и отправляемая через AJAX. Один из блоков содержит yii\jui\Slider. При первой загрузке через Controller::render() всё отрисовывается нормально, но при обновлении блока через AJAX (возвращается Controller::renderPartial()), естественно, Slider уже не включается (document.ready не отрабатывает). Вручную в JS делать $(’#slider’).slider() — не вариант, потому что там люто много параметров, которые не хочется дублировать, к тому же, это не наш подход!

Есть идеи?

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


<script type="text/javascript">jQuery(document).ready(function () {

...

jQuery('#slider').slider(...);

...

});</script>

Может быть можно его как-то заставить генерить подобное (без document.ready, естественно) при renderPartial()?

Нашёл «так себе» решение: в объекте View есть свойство js, которое содержит то, что нужно. Соответственно,


if (Yii::$app->request->isAjax && $this->js) {

	echo '<script type="text/javascript">';

	foreach ($this->js AS $jss) foreach ($jss AS $js) echo $js;

	echo '</script>';

}

Другие варианты?

Переопредели виджет в соответствии с требуемой логикой

Ничего не понял. Можно подробнее?

Переопредели виджет Slider, подробней уже некуда…

Типо MySlider extends Slider …

И что мне это даст?

Надо будет переопределять защищённые методы registerClientEvents() и registerClientOptions(), чтобы они при AJAX сразу плевали JS-код, а не передавали его во вьюху. Проще не переопределять их, а взять результат их работы из вьюхи, как выше показано.

Или я всё-таки неправильно понимаю, как переопределить виджеты?! Надо помнить, что нужен системный подход. И, если в блоке много разных виджетов (Slider, MaskedInput, …), придётся их все переопределять. И смысл тогда от этих виджетов, если их все надо переопределить?! Проще по-старинке напрямую JS-код в шаблон напихать…

Простите, а что это даст? Если можете покажите пример.

А насчет решения, так себе но лучше я тоже не нашел ничего.