这一集要实现的是ajax
提交评论,做完后,再次提交评论,页面就不会刷新了。这样对用户来说,体验会好的多。
在做ajax
之前,一定要确认,meta
标签和common.js
中,有了csrf
对应的代码。如果你之前已经完成了 ajax 上传图片部分的课程,那就肯定和我一样已经有了这些东西了。在laravel
中没有这些代码,那你的ajax
一定会报错的。
现在先来写一个最简单的ajax
。
controller
public function store(Request $request)
{
//return 'hello';
return $request->all();
}
js
<script>
$(function () {
$("#store-comment").click(function () {
$.post("/comments", $("form").serialize(), function (data) {
})
return false;
})
})
</script>
Tips: serialize() 的意思是序列化元素。你可以简单的理解成,获取表单的所有数据。
看 network 后发现,ajax
已经通了。
view
shared
目录中新建一个_comment.blade.php
,复制评论列表的这一段代码过去。
<li class="am-comment">
<img src="{{$comment->user->avatar()}}" alt="" class="am-comment-avatar" width="48" height="48">
<div class="am-comment-main">
<header class="am-comment-hd">
<div class="am-comment-meta">
<span class="am-comment-author">{{$comment->user->name}}</span>
{{$comment->created_at->diffForHumans()}}
</div>
</header>
<div class="am-comment-bd"><p>{!! markdown($comment->content) !!}</p></div>
</div>
</li>
controller
public function store(Request $request)
{
$comment = Comment::create($request->all());
return view('shared._comment', compact('comment'));
}
控制器中,现在应该做的是,当插入数据库后,返回一下这个片段。并且把新增的这条数据,传过去,那他里面就会显示这条数据对应的html
了。同样的通过network
测试一下
js
<script>
$(function () {
$("#store-comment").click(function () {
$.post("/comments", $("form").serialize(), function (data) {
$(".am-comments-list").append(data);
$("textarea").val('');
$('pre > code').each(function () {
hljs.highlightBlock(this);
});
})
return false;
})
})
</script>
进一步修改js
代码,php
那边插入到数据库后,js
就要用append
将这条信息动态的添加到html
中。
然后清空表单。
代码还要重新的高亮一下。
Don't repeat
因为新增的comment
和循环部分的 html 是一模一样的,那就直接include
一下就好了
@foreach($comments as $comment)
@include('shared._comment')
@endforeach