Yii2 Pjax在Yi2中不断刷新整个页面,Pjax在listview中被多次调用

Yii2 Pjax在Yi2中不断刷新整个页面,Pjax在listview中被多次调用,yii2,yii2-advanced-app,pjax,Yii2,Yii2 Advanced App,Pjax,这几天我一直在努力解决这个问题,基本上我在尝试让commetn和child发表评论, 注释有一个名为“retrievecomment”的按钮/链接,用于检索子注释 我发现pjax不工作,它不断刷新整个页面 <div class="row"> <?= $model['comment']?> </div> <div class="row"> <div id="selector"

这几天我一直在努力解决这个问题,基本上我在尝试让commetn和child发表评论, 注释有一个名为“retrievecomment”的按钮/链接,用于检索子注释

我发现pjax不工作,它不断刷新整个页面

    <div class="row">   
            <?= $model['comment']?>
    </div>
    <div class="row">
        <div id="selector"align="right">
            <?= Html::a('Retrieve Comment', ["../../thread/index?id=" . $model['thread_id'] . "&comment_id=" . $comment_id], 
                                        ['data-pjax' => '#childCommentData-'.$comment_id, 'class' => 'btn btn-default'
                                        ,'id' => 'retrieveComment' . $comment_id]) ?>
        </div>

        <?php Pjax::begin([
            'id' => 'childCommentData-'.$comment_id,
            'clientOptions'=>[
                    'timeout' => 5000,
                    'registerClientScript' => "$.pjax.reload({container:'#childCommentData-$comment_id'});",
                    'linkSelector'=>'#retrieveComment'.$comment_id
                    ]
            ]);?>

            <div  class="col-md-12">

                <?php if(isset($retrieveChildData)){ ?>
                    <?= ListView::widget([

                            'dataProvider' => $retrieveChildData,
                            'options' => [
                                'tag' => 'div',
                                'class' => 'list-wrapper',
                                    'id' => 'list-wrapper',
                            ],
                                'layout' => "\n{items}\n{pager}",

                            'itemView' => function ($model, $key, $index, $widget) {
                                return $this->render('_list_child_comment',['model' => $model]);
                            }, 
                            'pager' => [
                                'firstPageLabel' => 'first',
                                'lastPageLabel' => 'last',
                                'nextPageLabel' => 'next',
                                'prevPageLabel' => 'previous',
                                'maxButtonCount' => 3,
                            ],
                        ]) ?>

                <?php } ?>


            </div>
        <?php Pjax::end();?>
    </div>

</div>
最常见的问题来源 通常,pjax的整个页面刷新有两个可能的来源:

  • 您的pjax请求超过了pjax设置中设置的超时。这将导致整个页面刷新
  • 在第一个pjax请求完成之前触发另一个pjax请求,这也会导致整个页面刷新,因为pjax不支持多个并行刷新
  • 如何解决#1 这个很简单,看起来你自己已经解决了。您只需增加pjax超时值。您可以在每个小部件实例上单独执行此操作,也可以像下面这样全局设置它:

    if ($.pjax) {
        $.pjax.defaults.timeout = 5000;
    }
    
    上面的代码将所有pjax实例的默认超时设置为5000ms。通常已经足够了。对于复杂的web应用程序,通常的默认值650ms是相当严格的

    您可以在官方网站上找到所有选项:

    如何解决#2 这有点棘手,看起来这是你的问题。要找到答案,请查看调试工具栏,并确保保留跨页面日志(在chrome中,此设置名称为“网络”选项卡下的“保存日志”。如果您看到多个请求被触发,这就是您的问题

    如果是这样,您必须首先实现自己的检查,以确保在仍有一些pjax请求在运行时不会触发其他pjax请求。如果您不这样做,并且用户在彼此之后快速单击两个按钮,那么无论发生什么情况,您都会遇到这种情况

    我通常通过实现运行多少ajax请求的计数器来防止这种情况。如果计数器为0,我将触发新请求,否则我将等待

    ajax计数器示例:

    //this is the actual counter
    var ajaxCounter = 0;
    
    //this method is called whenever an ajax-request fires
    $(document).ajaxSend(function() {
        ajaxCounter++;
    });
    
    //this method is called whenever an ajax-request finishes...no matter of its result
    $(document).ajaxComplete(function() {
        ajaxCounter--;
    });
    
    //check if pjax calls are allowed right now
    var pjaxAllowed = function () {
        return ajaxCounter == 0;
    }
    
    等等!在触发pjax之前,您只需检查
    ajaxCounter==0
    或使用方便函数
    pjaxAllowed()
    ,如上所示。如果您不想每次都检查这一点,您可以实现自己的小pjax请求堆栈。pjax提供的事件很容易做到这一点:

    我希望我能帮助你。这一次也让我头疼!如果你需要更多的信息,请告诉我

    公共pjax调试
    • 调试工具栏是您的朋友。确保选中了Chrome开发工具的网络选项卡中的
      保存日志。否则,当页面重新加载时,您将无法跟踪请求
    • 如果您看到一个请求被中止,那么通常这表示上面的@2出现了问题
    • 如果您看到一个请求返回的不是HTTP代码200,那么请检查Chrome开发工具中的响应预览。通常这会显示发生的异常。在这种情况下,问题出在服务器端。仔细检查php代码并修复它
    • pjax容器中的链接是经过特殊处理的。如果希望它们触发周围pjax conatiner的刷新,请保持原样……否则,将属性
      data pjax=“0”
      添加到它们。这表示如果单击此链接,则不需要刷新
    • 阅读文档…这5分钟花得很好:

    我在chrome的网络中检查,只有1个pjax被触发,我们如何知道pjax请求成功?如果请求返回的状态码是200(OK),那么一切都很好!只需单击网络选项卡中相应的请求,查看返回了什么代码。我在回答问题2时遇到的行为是请求被中止,页面被重新加载。您可以向pjax的beforeplace事件添加一个侦听器,然后查看返回了什么内容。此外,调试面板中的请求预览应该会显示,并为您提供一些信息!为了完成此操作,需要提供一个wiki链接,解释HTTP状态代码:当我们从视图发送到控制器时,pjax是否包含在get中?因为我检查了源代码中只有2个参数,并且响应是text/html,状态代码是500I move in the link in the Pjax in the Pjax,现在我发送了两次表单,一次有Pjax但是失败,第二次没有Pjax但是失败success@PLM57回答得很好,老兄+1
    //this is the actual counter
    var ajaxCounter = 0;
    
    //this method is called whenever an ajax-request fires
    $(document).ajaxSend(function() {
        ajaxCounter++;
    });
    
    //this method is called whenever an ajax-request finishes...no matter of its result
    $(document).ajaxComplete(function() {
        ajaxCounter--;
    });
    
    //check if pjax calls are allowed right now
    var pjaxAllowed = function () {
        return ajaxCounter == 0;
    }