这太奇怪了,我不得不记录一个gif并附上我的解释,以便我可以更清楚地呈现它。
现在这是我对使用此gif的步骤的解释。
我要删除的表格:
<form method='POST' action=''>
<input type="hidden" name="comment_id" value="{{ $comment->id }}">
{{ csrf_field() }}
{{ method_field('delete') }}
<button class='submit-btn delete-comment' type='submit' name='commentDelete'>X</button>
</form>
JavaScript Ajax:
$('.delete-comment').on('click', function(event) {
event.preventDefault();
var button = $(this);
var flexbox = button.parents().eq(2);
var commentId = $("input[name=comment_id]").val();
$.ajax({
method: 'POST',
url: urlDeleteComment,
data: {
commentId: commentId,
_method: 'delete',
_token: token
}
}).done(function(response) {
flexbox.remove();
})
});
注释删除功能:
public function deleteComment(Request $request){
$commentId = $request['commentId'];
$comment = Comment::find($commentId);
$comment->delete();
}
自从我考虑了很长时间以来,我一直没有找到我的问题所在。
答案 0 :(得分:3)
我建议不要将每个删除按钮呈现为单个表单,而是建议使用单个AJAX函数来接受一个值,该函数由带有数据值的按钮(而不是表单提交)触发。例如
<button class="btn-delete" data-id="{{ $comment->id }}">Delete</button>
您不需要表单,隐藏字段或CSRF令牌。 AJAX处理其余的事情。
$('.btn-delete').on('click', function() {
var id = $(this).data('id'); // Gets the value from the data-id field
$.ajax({
url: urlDeleteComment, // I'm assuming you already have this set somewhere
method: 'POST',
data: 'comment_id='+id,
success: function(response) {
// ...
},
error: function(xhr) {
// ...
}
});
});
这将向服务器发送一个请求,其中包含按下的按钮的推荐ID。
我还建议您使用成功/错误功能,以便您处理删除失败的情况。 (例如评论已被删除,或者您没有删除此评论的权限。)
对于服务器端代码本身,您可以照原样处理。如果一切顺利,我建议您返回200或出现4xx / 5xx错误,以便在出现任何错误时触发AJAX错误功能。
关于实际的屏幕删除。我建议将注释包装在div
中,其ID应与删除按钮上的ID相匹配。例如:
<div class="comment" data-comment="{{ $comment->id}}">
<!-- Your comment here -->
<button class="btn-delete" data-id="{{ $comment->id }}">Delete</button>
</div>
因此,当您要从屏幕上删除注释时,请在AJAX成功回调中进行:
// ...
success: function(response) {
$('.comment[data-comment="' + id + '"]').slideUp();
}
// ...
之所以我建议使用替代方法而不是尝试解决当前方法(可能)的原因是,每次显示表单时,呈现表单都会涉及很多额外的工作/垃圾按钮。
使用通用的AJAX调用来接受来自按钮按下的参数通常是构建这些样式的应用程序的首选方法,因为它减少了不仅要首先构建它,而且还要将其维护在其中的大量工作。长期的。