Yii2 Pjax在Yi2中不断刷新整个页面,Pjax在listview中被多次调用
这几天我一直在努力解决这个问题,基本上我在尝试让commetn和child发表评论, 注释有一个名为“retrievecomment”的按钮/链接,用于检索子注释 我发现pjax不工作,它不断刷新整个页面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"
<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的整个页面刷新有两个可能的来源:
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分钟花得很好:
//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;
}