yii2 listview下一页没有更改网址

时间:2017-04-02 09:20:37

标签: yii2

Yii2列表视图缺少来自yii1的$.fn.yiilistview.update。更重要的是,它依赖于pjax的基本要求,因此使用嵌套的pjax,超时等创建各种问题,以便用listView进行简单的分页。

对控制器的GET请求由javascript呈现为HTML(从包含listview html的控制器返回的jSON)。由于在此过程中未更改URL,因此我没有使用pjax来避免复杂性并进行简单的ajax调用,并且基于成功返回的数据将更新容器。 (就像pjax只手动使用ajax而不更改url)

现在,当我执行下一页时,会更新URL并进行页面完全刷新。最初它不能正常工作但是一旦我在控制器中的页面GET参数上添加了IF检查,而不是在JSON中返回renderAjax输出,现在将直接返回HTML

如何在不使用pjax的情况下避免使用yii2 listview下一页更新URL,并使其能够以时尚方式编写控制器和javascript,以模拟上述手动ajax调用中的pjax?

控制器:

if($pageParam == null) {
    $page =  $this->renderAjax("_list", [
                        "dataProvider" => $dataProvider
             ]) ;

    Yii::$app->response->format = 'json';
    return array("error"=>false,"page"=>$page);
} else {
    return $this->renderAjax("_list", [
                        "dataProvider" => $dataProvider
             ]) ;
}

列表视图:

<?php if($dataProvider != null) : ?>
    <?= 
    ListView::widget([
        'id'=>'itemList',
        'dataProvider' => $dataProvider,
        'itemOptions' => ['class' => 'item'],
        'itemView' => '_dataListView',
        'summary'=>'',
        'emptyText'=>$emptyPage         
    ]) 
    ?>
<?php endif; ?>

js:

ajax成功GET回调:

success     : function(data) {
                    if(!data.error) {
                        $("#list-container").html(data.page);

listcontainer本身位于_list

的父视图中

2 个答案:

答案 0 :(得分:2)

您可以像这样配置pjax小部件:

    <? Pjax::begin(['enablePushState' => false]) ?>
...
    <? Pjax::end() ?>

您可能也对'enableReplaceState'选项感兴趣。 doc here

答案 1 :(得分:0)

很好,想通了,诀窍是不要做pjax:begin / pjax:在PHP中结束调用,而是在javscript中控制,因为我使用从yii返回的JSON手动替换HTML。

如果没有pjax,我无法想办法 - 所以这里是ajax的解决方案:成功

$("#list-container").html(data.page);
$(document).pjax('a', '#list-container', {push:false});