Название может быть немного расплывчатым, извините за это, позвольте мне объяснить.Запрос jQuery get() извлекает данные до отправки новых данных.
У меня есть users_status_likes
стол с последующей столбцами: идентификатор, user_id, status_id
Идея проста, когда пользователь щелкает как кнопки состояния, данные получает переданы в базу данных с вошедшего в user_id
и status_id
статуса.
Теперь я пытаюсь выполнить запрос get()
, чтобы получить количество понравившихся статусов. Проблема в том, что запрос get запрашивает количество понравившихся статусов до того, как будет добавлен новый.
Например, есть статус, у которого есть 1, но затем я нажимаю кнопку типа like, так что теперь у него есть 2 понравившиеся, в таблице есть 2 строки для одного status_id
, но у каждого есть другой user_id
. Когда я нажимаю подобную кнопку, консоль говорит count 1
, но это действительно должно быть count 2
, потому что мне просто понравился статус, и данные были отправлены в таблицу.
Я использую Laravel 5.2, так что позвольте мне начать с проводкой маршрут
Route::get('likestatusCount/{id}', '[email protected]');
getlikesCounter()
метод FeedController
public function getlikesCounter($id) {
$status = Status::find($id);
return Response::json(['count' => StatusLikes::where('status_id', $status->id)->count()]);
}
И форма внутри вида
{!! Form::open(['action' => '[email protected]', 'id' => 'like_form', 'class' => 'likeform']) !!}
<button type="submit" class="btn btn-info btn-xs like" data-user="{{ Auth::user()->id }}" data-status="{{ $status->id }}" id="like-status">
<i class="fa fa-thumbs-up"></i> <span class="like-button-text">Like</span> <span class="like-button-counter">({{ $likes_count }})</span>
</button>
{!! Form::close() !!}
Javascript
$('.likeform').submit(function(e) {
e.preventDefault();
var submitBtn = $(this).find('.like');
var likeText = $(this).find('span.like-button-text');
var likeCounter = $(this).find('span.like-button-counter');
var status_id = submitBtn.data('status');
var user_id = submitBtn.data('user');
var token = $('input[name=_token]').val();
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': token
}
});
$.ajax({
url: 'http://localhost/socialnet/public/likeStatus',
method: 'POST',
cache: false,
data: { like_status: status_id, user_id: user_id, _token: token },
success: function(data) {
submitBtn.removeClass('btn-info').addClass('btn-danger');
submitBtn.find($(".fa")).removeClass('fa-thumbs-up').addClass('fa-thumbs-down');
likeText.text('Dislike');
console.log(data);
},
error: function() {
console.log('error');
}
});
// data.count returns the count before the new like has been submitted
$.get("http://localhost/socialnet/public/likestatusCount/" + status_id, function(data) {
likeCounter.text(data.count);
console.log(data.count);
});
});
AJAX вызовы являются асинхронными, так что если вы полагаетесь на ответ будут доступны для других AJAX звонки, вам необходимо поместить их в функции обратного вызова , success() или error() – otherstark
Если вы заботитесь о производительности и разумном использовании ресурсов вообще, то вы должны вернуть это число _in response_ в запрос POST, который только что создал новое. – CBroe