2015-08-21 78 views
1

我正面臨PJAX的問題。當通過Pjax提交ActiveForm時,操作正在執行兩次。 一箇中止,另一個成功。 同時在數據庫中插入2個新模型,因爲前者正在插入並中止。Pjax請求被執行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爲什麼我的行動被中止,然後我創建通過引導模式這種模式執行。 我已經改變它的PJAX超時選項

+0

Hi.Did你的問題解決? – yafater

+0

是的,我做了...... –

+0

你是怎麼解決你的問題的?我有同樣的問題 – yafater

回答

1

我不是100%肯定在這個,因爲我需要直接測試你的代碼,以確保它的工作。但我認爲這個事件會被解僱兩次。我記得回顧過去一段時間,它似乎是成功事件的兩次行爲。

當我嘗試做類似於您正在做的事情時,我使用了pjax:end而不是pjax:success。所以你可能想嘗試一下,看看它是否有幫助。

此外,它可能有助於確保您的JavaScript正在被調用,一旦文檔準備就緒。因此,如下更新您的腳本也可能有所幫助。您可以瞭解更多關於自定義腳本的地方在Yii2文檔http://www.yiiframework.com/doc-2.0/guide-output-client-scripts.html

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

我有這個poblem添加,它僅僅是一個超時問題。 Pjax的默認超時時間太短。

+0

我有一些問題,你能告訴我編輯pjax超時的代碼嗎?謝謝 – Blackjack