我正在我的PHP平台上实现基于Laravel 4的评论系统。
目前的问题是,当我发送新评论时,它会被保存到数据库中,但返回的评论列表不包含刚刚插入的评论。
所以,自下而上,这是注释“跟随”到达数据库之前的路径:
这个函数只是将注释的数据传递给另一个函数,管理一些UI元素,然后在一切正常的情况下检索所有注释的列表:
$("#comments-button-new").click(function() {
var parameters = url.getURLParameters();
var entryID = parameters.pop(); // Put this inside a data attribute
comments.sendComment(
$("#comments-input-comment-new").val(),
entryID,
$("#comments-token").val(),
function() {
$("#comments-alert-error").addClass('hidden');
$("#comments-button-new").html("<span class='glyphicon glyphicon-ok'></span>");
getComments(); // When the POST response is received comments are retrieved
},
function() {
$("#comments-alert-error").removeClass('hidden');
}
);
});
这是实际向服务器发出POST请求的函数:
function sendComment(content, entryID, token, doneCallback, failCallback) {
$.post("http://localhost/comment/new",
{
content : content,
entryID : entryID,
_token : token
})
.done(doneCallback())
.fail(function(xhr) {
failCallback(xhr.response);
});
}
这是处理评论的控制器:
public function newComment() {
$content = Input::get('content');
$entryID = Input::get('entryID');
$hashids = new \Hashids\Hashids(Config::get('security.salt'), Config::get('security.minimumHashLength'));
$entryID = $hashids->decrypt($entryID);
$comment = new Comment();
$result = $comment->newComment($content, $entryID[0]);
if($result != 'OK') {
return Response::make($result, 500);
}
return Response::make('OK', 200);
}
这是位于newComment
模型中的Comment
函数,用于将注释保存在数据库中:
public function newComment($content, $entryID) {
$validator = Validator::make(
array(
'content' => $content,
'entryID' => $entryID
),
array(
'content' => 'max:'.self::$COMMENT_MAX_LENGTH,
'entryID' => 'exists:entries,id'
)
);
if($validator->fails()) {
return $validator->messages()->all();
}
$this->author = Auth::user()->username;
$this->content = $content;
$this->parentEntryID = $entryID;
$this->save(); // Comment is saved in the Database
return 'OK';
}
评论正确保存在数据库中,然后,在返回后您可以看到之后我想要检索所有条目的评论。问题是所有的评论都返回了。 如果我尝试重新加载页面,则返回每个评论,包括最后一个评论。
看起来getComments
JS函数在注释保存在数据库之前执行。
修改:
不确定是否相关,但JS功能使用 require.js 。
答案 0 :(得分:2)
在sendComment
函数中,您已撰写.done(doneCallback())
。也就是说,当您从服务器获得响应时,您在设置AJAX帖子时运行doneCallback
- 而不是。并且您的回调函数未定义,因此不会发生任何事情。
这是一个简单的修复:用.done(doneCallback)
替换该行。这样,当POST成功返回时,将调用传入doneCallback
函数的sendComment
,而不是在设置时。