我尝试在 yii2 项目中使用 Pjax 小部件。
我的目标是使用一些内容更新div #formsection
我的代码:
图
<?php Pjax::begin(); ?>
<div id="formsection"></div>
<?php foreach ($tree as $id => $name): ?>
<?php echo Html::a(
$name,
['update', 'id'=>$id],
['data-pjax'=> '#formsection']) ?>
<?php endforeach ?>
<?php Pjax::end(); ?>
更新行动
public function actionUpdate($id)
{
return $this->renderAjax('update');
}
当我点击链接时,所有pjax div
内容都会被来自服务器的响应所取代。我只想更新#formsection
内容。
我找到了帖子here,但它也不起作用。
更多信息: 这是Pjax小部件在页面中生成的js代码。
jQuery(document).ready(function () {
jQuery(document).pjax("#w0 a", "#w0", {"push":true,"replace":false,"timeout":1000,"scrollTo":false});
jQuery(document).on('submit', "#w0 form[data-pjax]", function (event) {jQuery.pjax.submit(event, '#w0', {"push":true,"replace":false,"timeout":1000,"scrollTo":false});});
});
我的代码有什么问题?
我解决了这个问题。我不得不改变观点。
<div id="categories">
<?php foreach ($tree as $id => $name): ?>
<?php echo Html::a(
$name,
['update', 'id'=>$id],
['data-pjax'=> '#formsection']) ?>
<?php endforeach ?>
</div>
<?php Pjax::begin(['id'=>'formsection', 'linkSelector'=>'#categories a']); ?>
<?php Pjax::end(); ?>
答案 0 :(得分:6)
Pjax
的正确解决方案如果您不想在Pjax::begin()
和Pjax::end()
之间放置代码数据
使用Pjax::widget()
并添加linkSelector
选项:
Pjax::widget(['id' => 'formsection', 'linkSelector' => '#categories a']);
其中formsection
是在单击#categories a
链接时接收Pjax返回的数据的元素的id。 #categories a
是 JQuery Selector
答案 1 :(得分:3)
有点晚了,但我想补充一些东西 - 无论你设置什么,pjax id属性都将填充ajax响应。在我的情况下,我只想回复一个&#34;已保存的&#34;消息而不是替换整个表单所以我使用了这个:
<span id="modal-response"></span>'
<?php
Pjax::widget([
'id' => 'modal-response', // response goes in this element
'enablePushState' => false,
'enableReplaceState' => false,
'formSelector' => '#options-form',// this form is submitted on change
'submitEvent' => 'change',
]);
?>
答案 2 :(得分:1)
我认为,只需从pjax
中编写该div即可解决问题。只是一个猜测!
像这样,
<div id="formsection"></div>
<?php Pjax::begin(); ?>
<?php foreach ($tree as $id => $name): ?>
<?php echo Html::a(
$name,
['update', 'id'=>$id],
['data-pjax'=> '#formsection']) ?>
<?php endforeach ?>
<?php Pjax::end(); ?>
此外,在控制器中,部分渲染视图。
return $this->renderPartial('update');
答案 3 :(得分:1)
你不能通过Pjax重新加载不同的块,就像你在Pjax中使用的那样。 Pjax只重新加载其中的块。 例如:
Pjax::begin(['id' => 'boxPajax']);
<a>some html<a>
Pjax::end();
所以在html中你会选择
<div id="boxPajax">
<a>some html<a>
</div>
当你点击链接时,Pjax会在此链接中向url发送请求,然后他将重新加载id =&#34; boxPajax&#34;成功回应。