Yii2 Pjax不工作

Yii2 Pjax不工作,yii2,pjax,yii2-advanced-app,Yii2,Pjax,Yii2 Advanced App,我想使用Pjax刷新gridview,但不知何故它不起作用。代码如下: \u search.php <?php use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\widgets\Pjax; $this->registerJs(" $('#btnAjaxSearch').click(function(){ $.ajax({

我想使用Pjax刷新gridview,但不知何故它不起作用。代码如下:

\u search.php

    <?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\Pjax;

$this->registerJs("
                  $('#btnAjaxSearch').click(function(){
                        $.ajax({
                                type: 'get',
                                data: $('.bank-search form').serializeArray(),
                                success: function (data) {
                                      $.pjax.reload({container:\"#bank\"});
                                },
                                error: function (XMLHttpRequest, textStatus, errorThrown) {
                                      alert('error');
                                }
                        });
                       return false;
                  });
                ", \yii\web\View::POS_END, 'bank-search');
?>

<div class="bank-search">
    <?php Pjax::begin(['id' => 'bank-form']); ?>
    <?php $form = ActiveForm::begin([
        'action' => ['index'],
        'method' => 'get',
    ]); ?>

    <?= $form->field($model, 'bank_name') ?>

    <?= $form->field($model, 'state') ?>

    <?= $form->field($model, 'district') ?>

    <?= $form->field($model, 'city') ?>

    <div class="form-group">
        <?= Html::Button('Search', ['class' => 'btn btn-primary','id' => 'btnAjaxSearch']) ?>
    </div>

    <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>

</div>
    <?php

use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\Pjax; 

$this->title = 'Banks';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="bank-index">

    <h1><?= Html::encode($this->title) ?></h1>
    <?php  echo $this->render('_search', ['model' => $searchModel]); ?>

    <p>
        <?= Html::a('Create Bank', ['create'], ['class' => 'btn btn-success']) ?>
    </p>
    <?php Pjax::begin(['id' => 'bank']); ?>
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
            'bank_name',
            'state',
            'district',
            'city',
            // 'branch',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>
    <?php Pjax::end(); ?>
</div>

简单搜索正在工作,但Pjax没有。我是Yii2的新手,因此任何帮助都将不胜感激。谢谢。

Pjax的工作方式是发送另一个带有特殊头的请求。当检测到pjax请求时,服务器只返回更新容器所需的html。线

$.pjax.reload({container:\"#bank\"});
将发送另一个请求,并且内部actionIndex查询参数将为空

您可以通过将搜索参数存储到会话或通过在查询字符串中使用参数指定pjax url来解决此问题

请尝试以下操作:

  var url = urlWithFilters(); 
  $.pjax({url: url, container: '#bank'});

在这种情况下,您不需要创建自己的ajax调用,只需使用过滤器创建url。

谢谢Edin。它帮助我解决了这个问题。这就是我所做的。它可能会帮助面临同样问题的人

正如Edin提到的,为了刷新gridview,您需要将url和搜索参数一起传递给Pjax

这是我编辑的代码:

    $js = <<<JS
        // get the form id and set the event
        $('#bank-form-id').on('beforeSubmit', function(e) { 
           var form = $(this);
            if(form.find('.has-error').length) {
                return false;
            }
            $.ajax({
                url: form.attr('action'),
                type: 'post',
                data: form.serialize(),
                success: function(response) { 
                    var csrf = yii.getCsrfToken();
                    var bank_name = $('#banksearch-bank_name').val();
                    var state = $('#banksearch-state').val();
                    var district = $('#banksearch-district').val();
                    var city = $('#banksearch-city').val();
                    var url = form.attr('action')+ '&_csrf='+csrf+'&BankSearch[bank_name]='+bank_name+'&BankSearch[state]='+state+'&BankSearch[district]='+district+'&BankSearch[city]='+city;
                    $.pjax.reload({url: url, container:'#bank'});
                }
            });    
        }).on('submit', function(e){
        e.preventDefault();
    });
JS;
$this->registerJs($js);
$js=
    $js = <<<JS
        // get the form id and set the event
        $('#bank-form-id').on('beforeSubmit', function(e) { 
           var form = $(this);
            if(form.find('.has-error').length) {
                return false;
            }
            $.ajax({
                url: form.attr('action'),
                type: 'post',
                data: form.serialize(),
                success: function(response) { 
                    var csrf = yii.getCsrfToken();
                    var bank_name = $('#banksearch-bank_name').val();
                    var state = $('#banksearch-state').val();
                    var district = $('#banksearch-district').val();
                    var city = $('#banksearch-city').val();
                    var url = form.attr('action')+ '&_csrf='+csrf+'&BankSearch[bank_name]='+bank_name+'&BankSearch[state]='+state+'&BankSearch[district]='+district+'&BankSearch[city]='+city;
                    $.pjax.reload({url: url, container:'#bank'});
                }
            });    
        }).on('submit', function(e){
        e.preventDefault();
    });
JS;
$this->registerJs($js);