Как в yii2 предотвратить повторное подключение скриптов после ajax запроса?

У меня на странице с помощью yii2-editable (demos.krajee.com/editable) отображаются несколько записей из БД. И есть кнопка для ajax добавления новой записи. С помощью renderAjax обновляю список, но при этом подключаются повторные скрипты, и все yii2-editable перестают работать. Как можно отключить добавление ненужных скриптов и как в yii вообще продумано обновление страницы после Ajax запроса?
  • Вопрос задан
  • 4642 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Akellacom
CTO
Я обычно делаю ajax запрос на какой-то экшн в контролере, где обрабатываю данные и выдаю обновленную страницу с помощью renderPartial, она отдается без layout, что как раз и не генерирует дополнительных скриптов.
Ответ написан
Akellacom дело говорит, только все это можно делать и в однм контроллере - зачем нам плодить еще один идентичный контроллер с такой же логикой, но с частичным рендером страницы. Тоесть, нужно проверть Ajax это запрос или нет. Если Ajax, то рендерить только саму вьюху (renderPartial), если же это не Ajax, то рендерить всю страницу вместе с заголовками.
В Yii1 делалось это так:
$viewFile = 'viewFile';
$viewData = array('model' => $model,);
if(Yii::$app->request->isAjaxRequest){
    $this->renderPartial($viewFile, $viewData);
}else{
    $this->render($viewFile, $viewData);
}

Дело в том, что всякие фичи типа Ajax update page если при получении через ajax-запрос новых данных они получают всю страницу (шапку, садбары, контент, футтеры, CSS-, JS-файлы), то они вырезають только ту часть, которую нужно обновить и обновляют ее. Для того, чтобы юзеру не гонять по http лишний траффик, следует проверять Ajax ли это запрос или нет. Вот линк на документацию: тыць, но может возникнуть проблема из-за тонкостей заголовков - тыць
Сорри, в Yii2 еще не приходилось делать подобного, но уверен, что реализация на 90% аналогичная с Yii1
Ответ написан
В Yii2 проверяем if Yii::$app->request->isAjax
Ответ написан
Комментировать
TTA
@TTA
Мутировавший технарь :)
для потомков)) просто отключаем бандлы которые не нужны
if (Yii::$app->request->isAjax) {
            Yii::$app->assetManager->bundles = [
                'yii\bootstrap\BootstrapPluginAsset' => false,
                'yii\bootstrap\BootstrapAsset' => false,
                'yii\web\JqueryAsset' => false
            ];
            return $this->renderAjax('create', [
                'model' => $model,
            ]);
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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