我正在开发一个问答网站,我希望能够在不刷新页面的情况下提交问题的答案。我使用ajax但是我点击提交按钮没有任何反应。
这是我的表格。我知道它非常混乱;)
{{Form::open(array('method' => 'POST', 'class' => 'post_ans','action' => 'QuestionController@post_answer','style'=>'display:'.$textarea_display))}}
<textarea name="answer_content" rows="12"></textarea>
{{$errors->first('answer_content')}}
<input type="hidden" name="this_question" value="{{$question[0]->question_id}}">
<input type="submit" id="post_answer" value="Добави">
{{Form::close()}}
我的路线:
Route::post('/question','QuestionController@post_answer');
控制器:
public static function post_answer()
{
$data=Input::all();
return Answer::postAnswer($data);
}
jquery代码:
$('form.post_ans').on('submit',function(event){
event.preventDefault();
var data={
this_question:$('#this_question').val(),
answer_content:$('#answer_content').val()
};
console.log(data);
var url= $(this).attr('action');
console.log(url);
$.ajax({
type:"POST",
url:url,
data:data
}).done(function(){
console.log("success!");
}).fail(function(){
console.log('fail');
}).always(function(){
console.log("always");
});
});
模特:
public static function postAnswer($data)
{
$rules=array(
'answer_content'=>'required'
);
$messages=array(
'answer_content.required'=>'Това поле е задължително'
);
$validator=Validator::make($data, $rules, $messages);
if($validator->fails())
{
return Redirect::to('/question/'.$data['this_question'])->withErrors($validator);
}
else
{
$date=date('d.m.Y');
$poster=Session::get('user_logged');
DB::table('answers')->insert(array(
'to_question'=>$data['this_question'],
'content'=>$data['answer_content'],
'date'=>$date,
'class'=>0,
'subject'=>'undefined',
'likes'=>0,
'best_answer'=>'false',
'by'=>$poster
));
DB::table('questions')->where('question_id',$data['this_question'])->increment('answers');
return Redirect::to('/question/'.$data['this_question']);
}
}
这就是我在控制台中得到的结果:
在模型中,我不确定在存储数据后该怎么做,所以我只是重定向到同一页面。
答案 0 :(得分:1)
首先,如果您查看屏幕截图,this_question
对象的data
属性为undefined
,这就是 QuestionController 的方式其中使用$data['this_question']
进行重定向。看看它是如何工作的?检查表单中的隐藏字段,因为这是设置this_question
的位置:
<input type="hidden" name="this_question" value="{{$question[0]->question_id}}">
另外,检查jQuery选择器中的data
对象。您使用$('#...')
作为ID,但我不会在表单中看到包含这些ID的元素。
其次,由于用户体验,Ajax的标志是不进行任何重新加载(或重定向)。如果您需要重定向和,您希望保留Ajax,正确的方法是通过JavaScript,.done()
方法 - 使用window.location.href
或{{1} }。
要在window.location.reload(true)
方法中获得结果,您需要从 QuestionController 向JS脚本返回一些内容。因此,您可以执行类似的操作,而不是重定向:
.done()
之后您将收到return Response::json(true);
的回复:
.done()
通常,考虑是否为表单使用Ajax是重要的还是合理的。然后将您的代码重构为上面显示的内容,或者忘记Ajax并使用重定向生成标准表单提交。