Yii2使用ajax提交模式表单
我已经成功地创建了模态表单,但是我不能用ajax提交它。每次我点击submit按钮时,它都不会停留在索引页面中,而是从我的控制器中显示Yii2使用ajax提交模式表单,yii2,yii2-basic-app,Yii2,Yii2 Basic App,我已经成功地创建了模态表单,但是我不能用ajax提交它。每次我点击submit按钮时,它都不会停留在索引页面中,而是从我的控制器中显示echo 1 我的控制器 public function actionCreate() { $model = new Testing(); if ($model->load(Yii::$app->request->post())) { if($model->save()){ echo
echo 1
我的控制器
public function actionCreate()
{
$model = new Testing();
if ($model->load(Yii::$app->request->post())) {
if($model->save()){
echo 1;
}else{
echo 0;
}
}else{
return $this->renderAjax('create', [
'model' => $model,
]);
}
}
我的表格
<div class="testing-form">
<?php $form = ActiveForm::begin(['id' => $model->formName()]); ?>
<?= $form->field($model, 'test')->textInput(['maxlength' => true]) ?>
<div class="form-group">
<?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
<?php
$this->registerJS("
$('form#{$model->formName()}'.on('beforeSubmit', function(e)
{
var \$form = $(this);
$.post(
\$form.attr('action'),
\$form.serialize()
)
.done(function(result) {
if(result == 1)
{
$(\$form).trigger('reset');
$.pjax.reload({container:'#issuehrGrid'});
}else
{
$('#message').html(result.message);
}
}).fail(function()
{
console.log('server error');
})
return false;
});"
);
?>
我怀疑它会向你展示空白代码页,上面有“代码> 1”/代码>,这是因为在第一次提交之后,你的PJAX网格通过语句
重新加载。
$.pjax.reload({container:'#issuehrGrid'});
重新加载您的<代码>前提交/ <代码>事件不会再次绑定到表单,因为表单“代码> HTML 再次加载,当您提交表单第二次时,它只做一个简单的表单提交,并显示空白页,带有“代码> 1”/代码>,您需要使用<代码> PJAX:PJAX完成< <代码>事件,因此,当网格重新加载时,您的脚本将
beforesmit
事件再次绑定到表单
此外,脚本中存在语法错误,应该予以修复。将脚本更改为以下内容
<?php
$formName = $model->formName();
$js = <<<JS
$(document).on("ready pjax:complete",function(){
$('form#{$formName}').on('beforeSubmit', function(e){
var \$form = $(this);
$.post(
\$form.attr('action'),
\$form.serialize()
).done(function(result) {
if(result == 1)
{
$(\$form).trigger('reset');
$.pjax.reload({container:'#issuehrGrid'});
}else
{
$('#message').html(result.message);
}
}).fail(function()
{
console.log('server error');
})
return false;
});
});
JS;
$this->registerJS(
$js,
\yii\web\View::POS_READY
);
?>
更新
不要忘记更改控制器操作代码,并将echo 1
更改为return 1
,将echo 0
更改为return 0
,因为您正在控制器操作代码中执行此操作。不知道你在做什么或试图做什么你是否试图提交表单,然后显示消息并保持在同一表单上?另外,您应该只返回1
而不是回显1
谢谢您的帮助,我已尝试按照您所说的更改脚本,但仍然无法正常工作。我可以问一下为什么像这样使用斜杠前置变量\$form
,我以前从未见过它。我使用F12查看源代码,斜杠不见了,只需显示$form
,这就是它不起作用的原因吗?我使用了herdoc
语法来添加脚本,并使用“\”来转义,这样它就不会将它与php弄错,并强制将其解析为php变量,不起作用的是,当加载页面或单击按钮时,控制台上是否出现错误@SaoHono,控制台中没有错误,但它确实有此警告[Deprecation]主线程上的同步XMLHttpRequest已被弃用,因为它会对最终用户的体验产生有害影响。如需更多帮助,请查看https://xhr.spec.whatwg.org/.
ok,当您单击submit时,控制台或ajax请求是否显示任何错误@SaoHo,您需要更改echo 1代码>到返回1代码>和echo 0
到在controllerno中返回0
,这是控制台,然后单击submit。这是在提交之后
<?php
$formName = $model->formName();
$js = <<<JS
$(document).on("ready pjax:complete",function(){
$('form#{$formName}').on('beforeSubmit', function(e){
var \$form = $(this);
$.post(
\$form.attr('action'),
\$form.serialize()
).done(function(result) {
if(result == 1)
{
$(\$form).trigger('reset');
$.pjax.reload({container:'#issuehrGrid'});
}else
{
$('#message').html(result.message);
}
}).fail(function()
{
console.log('server error');
})
return false;
});
});
JS;
$this->registerJS(
$js,
\yii\web\View::POS_READY
);
?>