Pjax请求执行2次,然后执行

时间:2015-08-21 05:45:26

标签: yii2

我正面临着PJAX的问题。通过Pjax提交ActiveForm时,操作正在执行两次。 一个是流产,另一个是成功。 同时,由于前者正在插入和中止,因此在数据库中插入了2个新模型。

我的控制器代码是

public function actionCreate()
    {
        $model = new Products();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return "Success";
        } else {
            return $this->renderAjax('_form', [
                'model' => $model,
            ]);
        }
    }

我的_form.php是

<?php
$this->registerJs('
    $.pjax.defaults.timeout = 5000;
    $("#product-form-pjax").on("pjax:success", function(data, status, xhr, options) {
            if(options.responseText == "Success"){
                $.pjax.reload({container: "#pjax-gridview", timeout: 2000});
                $("#activity-modal").modal("hide");
            }
    });
    ');
?>


<div class="products-form">

    <?php Pjax::begin(['id' => 'product-form-pjax', 'enablePushState' => FALSE]) ?>

    <?php $form = ActiveForm::begin([
        'id' => 'crud-model-form',
        'action' => ['product/create'],
        'options' => [
            'data-pjax' => true,
            ]
        ]);
    ?>

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

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

    <?= $form->field($model, 'brand')->dropDownList(ArrayHelper::map(Brands::find()->all(),'id','name')) ?>

    <?= $form->field($model, 'category')->dropDownList(ArrayHelper::map(Categories::find()->all(),'id','name'),['select' => ''])?>

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

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

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

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

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

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

    <?php Pjax::end() ?>

</div>

我是通过在GridView上启用Pjax的bootstrap模型创建此模型的 那么为什么我的行动被中止然后执行。 我已经更改了PJAX超时选项

2 个答案:

答案 0 :(得分:1)

我对此并不是100%肯定,因为我需要直接测试您的代码以确保其有效。但我认为timestamp_micros INTEGER The timestamp (in microseconds) at which this event was logged. previous_timestamp_micros INTEGER The timestamp (in microseconds) at which this event was previously logged. 事件会被触发两次。我记得有一段时间回顾它,看起来成功事件的目的是两次射击。

当我尝试做与您正在做的事情类似的事情时,我使用pjax:success代替pjax:end。所以你可能想尝试一下,看看它是否有帮助。

此外,确保在文档准备好后调用javascript可能会有所帮助。因此,如下更新脚本也可能有所帮助。您可以在Yii2文档http://www.yiiframework.com/doc-2.0/guide-output-client-scripts.html

中了解有关自定义脚本添加位置的详细信息
pjax:success

答案 1 :(得分:0)

我有这个问题,这只是一个超时问题。 Pjax的默认超时时间太短。