【发布时间】:2015-03-05 06:39:34
【问题描述】:
我正在使用 Laravel 创建一个社交网站。我正在使用 ajax,因此用户可以在动态数量的帖子上发布 cmets。
我的问题是我不知道如何响应控制器中的 ajax。我的控制台显示 ajax 返回整个页面。这会导致在重新加载页面之前发布的新 cmets 显示不正确。所以我添加了一个if 语句来处理ajax,但我不知道如何处理。
我的 cmets 的 VIEW 看起来像这样。
<div class="comment-box-container ajax-refresh">
// COMMENTS ARE DISPLAYED HERE
<div class="comment-box">
@if ($type->comments)
@foreach ($type->comments as $comment)
<div class="user-comment-box">
<div class="user-comment">
<p class="comment">
<!-- starts off with users name in blue followed by their comment-->
<span class="tag-user"><a href="{{ route('profile', $comment->owner->id) }}">{{ $comment->owner->first_name }} {{ $comment->owner->last_name }}</a> </span>{{ $comment->body }}
</p>
<!-- Show when the user posted comments-->
<div class="com-details">
<div class="com-time-container">
{{ $comment->created_at->diffForHumans() }} ·
</div>
</div>
</div><!--user-comment end-->
</div><!--user-comment-box end-->
@endforeach
@endif
// USER TYPES COMMENT HERE
<!--type box-->
<div class="type-comment">
<div class="type-box">
{{ Form::open(['data-remote', 'route' => ['commentPost', $id], 'class' => 'comments_create-form']) }}
{{ Form::hidden('user_id', $currentUser->id) }}
{{ Form::hidden($idType, $id) }}
{{--{{ Form::hidden('user_id', $currentUser->id) }}--}}
{{ Form::textarea('body', null, ['class' =>'type-box d-light-solid-bg', 'placeholder' => 'Write a comment...', 'rows' => '1']) }}
{{ Form::close() }}
</div><!--type-box end-->
</div><!--type-comment-->
</div><!--comment-box end-->
用户通过按“输入/返回”键提交评论类型框的表单。这是 JS
<script>
$(document).on('keydown', '.comments_create-form', function(e) {
if (e.keyCode == 13) {
e.preventDefault();
$(this).submit();
}
});
</script>
而我的 Ajax 看起来像这样:
(function(){
$(document).on('submit', 'form[data-remote]', function(e){
e.preventDefault();
var form = $(this)
var target = form.closest('div.ajax-refresh');
var method = form.find('input[name="_method"]').val() || 'POST';
var url = form.prop('action');
$.ajax({
type: method,
url: url,
data: form.serialize(),
success: function(data) {
var tmp = $('<div>');
tmp.html(data);
target.html( tmp.find('.ajax-refresh').html() );
target.find('.type-box').html( tmp.find('.type-box').html() );
tmp.destroy();
}
});
});
})();
cmets 在 CommentsController 中处理。我的控制器如下所示:
路线
Route::post('post/{id}/comment', ['as' => 'commentPost', 'uses' => 'CommentsController@postComment']);
控制器
public function postComment()
{
extract(Input::only('user_id', 'resource_id', 'body'));
$this->execute(new PostCommentCommand($user_id, $resource_id, $body));
if(Request::ajax()){
// NOT SURE WHAT TO PUT HERE???
}
return Redirect::back();
}
我正在使用 Commandbus 。 PostCommentCommand 是一个数据传输对象,最终通过 PostCommentCommandHandler 使用handle() 方法进行处理:
public function handle($command)
{
$comment = $this->postRepository->leaveComment($command->user_id, $command->resource_id, $command->body);
return $comment;
}
postRepository->leaveComment() 看起来像这样:
public function leaveComment($user_id, $resource_id, $body)
{
$comment = Comment::leavePostComment($resource_id, $body);
User::findOrFail($user_id)->comments()->save($comment);
return $comment;
}
我不确定如何在我的控制器中进行这项工作。我知道我需要确定我是否在使用 ajax if(Request::ajax()){},但我不知道之后该怎么做。
我的主要目标是尝试制作一个类似于 facebook 的评论系统。用户可以在任何页面上的任何帖子上进行 cmet,而无需重新加载页面。我希望将同样的 ajax 系统用于“点赞系统”,这样用户就可以在不重新加载页面的情况下点赞照片和 cmets。
有没有人对此有任何想法或解决方案?我是 Laravel 的新手,甚至是 Ajax 和 JavaScript 的新手。详细的描述将不胜感激。谢谢!
【问题讨论】:
标签: javascript php ajax laravel