@sepetov
Программист Navision, программист PHP

Почему перезагружается страница, когда я перезагружаю только контейнер pjax?

Добрый вечер! Вопрос, собственно, в названии. Куда копать и что исследовать, чтобы решить проблему?
Вот самая простейшая разметка:
<button onclick="get_content();">Отобразить таблицу</button>
<div id="content">
    Сюда загрузится GridView от kartik-v
</div>

После нажатия кнопки загрузка идёт самым прямолинейным способом:
function get_content()
{
    $.ajax({
        url: '/some/data',
        type: 'get',
        data: {id: 123},
        success: function(answer) {
            $('#content').html(answer);
        },
    });
}

В контроллере вызываемое действие имеет такой вид:
public function actionData($id)
{
    $tab_content = new TabContent;
    $parameters = $tab_content->getData($id); // возвращает поисковую модель, провайдер данных и вспомогательные переменные
    return $this->renderAjax('view_name', $parameters);
}

Это всё работает и нареканий нет. GridView отображается, работают его фильтры и сортировка. Но на этой же странице есть кнопка, где вызывается такой код:
$.pjax.reload({container:"#kv-pjax-data"});
После его выполнения происходит перезагрузка GridView (что и должно), но после этого сразу начинается перезагрузка всей страницы. Почему так происходит?

Таймаута хватает, я его увеличил и возвращал для проверки пустой GridView. Параллельного pjax-запроса у меня нет ни до, ни после, поэтому я исключаю, что следующий начал выполняться до окончания предыдущего.
spoiler

Настройки виджета такие:
<?= GridView::widget([
    'id' => 'data-grid-view',
    'dataProvider' => $selectedData,
    'filterModel' => $searchSelectedData,
    'pjax' => true,
    'pjaxSettings' => [
        'options' => [
            'id' => 'kv-pjax-data',
            'enablePushState' => false,
        ],
    ],
    'columns' => $columns,
]); ?>

  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
@sepetov Автор вопроса
Программист Navision, программист PHP
Причина оказалась в том, что pjax берёт данные с текущего url, если не указать явный. В моём случае нужные данные находятся в другом контроллере (не в том, который показывает это представление). Можно поменять так:
let href = '/some/data';
$.pjax.reload({container:'#data-grid-view', url:href, push:false});

Это работает, но pjax игнорирует push = false, когда явно указан параметр url. Но это можно обойти так:
$.pjax({
    url: '/some/data',
        container  : '#data-grid-view',
        push : false,
});

Как видно, вызывается $.pjax(), а не $.pjax.reload(), но работает как reload().
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

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