Saya sedang membangunkan aplikasi blog dalam Laravel 8.
ArticleController pengawal Saya mempunyai kaedah ini untuk memaparkan satu artikel dan komennya:
class ArticlesController extends FrontendController { // More code public function show($slug) { // Single article $article = Article::firstWhere('slug', $slug); $old_article = Article::where('id', '<', $article->id)->orderBy('id', 'DESC')->first(); $new_article = Article::where('id', '>', $article->id)->orderBy('id', 'ASC')->first(); // Comments $commentsQuery = Comment::where(['article_id' => $article->id, 'approved' => 1])->orderBy('id', 'desc'); $comments = $commentsQuery->paginate(10); $comments_count = $commentsQuery->count(); return view('themes/' . $this->theme_directory . '/templates/single', array_merge($this->data, [ 'categories' => $this->article_categories, 'article' => $article, 'old_article' => $old_article, 'new_article' => $new_article, 'comments' => $comments, 'comments_count' => $comments_count, 'tagline' => $article->title, ]) ); } }
Dalam paparan saya mempunyai senarai komen seperti ini:
<div id="commentsList"> <ol class="commentlist {{ boolval($is_infinitescroll) ? 'infinite-scroll' : '' }}"> @foreach ($comments as $comment) <li class="depth-1 comment"> <div class="comment__avatar"> <img class="avatar" src="{{ asset('images/avatars/' . $comment->user->avatar) }}" alt="" width="50" height="50"> </div> <div class="comment__content"> <div class="comment__info"> <div class="comment__author">{{ $comment->user->first_name }} {{ $comment->user->last_name }}</div> <div class="comment__meta"> <div class="comment__time">{{ date('jS M Y', strtotime($comment->created_at)) }}</div> <div class="comment__reply"> <a class="comment-reply-link" href="#0">Reply</a> </div> </div> </div> <div class="comment__text"> <p>{{ $comment->body }}</p> </div> </div> </li> @endforeach </ol> <div class="ajax-load text-center is-hidden"> loading... </div> </div>
Laluan berkaitan artikel:
// Article routes Route::get('/', [ArticlesController::class, 'index'])->name('homepage'); Route::get('/category/{category_id}', [ArticlesController::class, 'category'])->name('category'); Route::get('/author/{user_id}', [ArticlesController::class, 'author'])->name('author'); Route::get('/show/{slug}', [ArticlesController::class, 'show'])->name('show');
Saya mahu menggantikan penomboran komen dengan "skrol tak terhingga".
Untuk tujuan ini saya ada:
/* Infinite comments */ function infiniteComments() { var page = 1; $(window).scroll(function() { if ($(window).scrollTop() + $(window).height() >= $(document).height() - $('.s-footer').height()) { page++; loadMoreData(page); } }); } function loadMoreData(page){ var base_url = window.location.href.split('?')[0]; $.ajax({ url: `${base_url}?page=${page}`, type: "get", beforeSend: function() { $('.ajax-load').show(); } }) .done(function(data) { if (data.html == "") { $('.ajax-load').hide(); return; } $('.ajax-load').hide(); $(".infinite-scroll").append(data.html); }) .fail(function(jqXHR, ajaxOptions, thrownError) { console.log('The server is not responding...'); }); } $(document).ready(function(){ infiniteComments(); });
Ulasan pada halaman 2 dipaparkan dengan betul semasa melawati https://larablog.com/show/deserunt-qui-exeritationem?page=2
, konsol Chrome menunjukkan ini 500 (Ralat Pelayan Dalaman) Ralat:
https://larablog.com/show/deserunt-qui-exercitationem?page=65 500 (Internal Server Error) The server is not responding... https://larablog.com/show/deserunt-qui-exercitationem?page=76 500 (Internal Server Error) The server is not responding...
Ralat boleh dikesan kembali kepada mesej ralat pada baris 70 dalam ArticlesController - $article = Article::firstWhere('slug', $slug)
:
Cuba mendapatkan harta "id" bukan objek.
Ini pelik kerana $article = Article::firstWhere('slug', $slug)
berfungsi dengan baik tanpa Ajax.
firstWhere
返回符合传递条件的第一条记录,默认为null
. Jadi, milik andaakan mengembalikan nilai
slug
与$slug
匹配的第一篇文章,如果不存在这样的记录,则返回null
。现在,每当您引用$article->id
时,您都会认为$article
是一个正确的Article
并且您想知道其id
. Jika tiada artikel yang sepadan, ini akan menghasilkan ralat yang anda hadapi.Jadi adalah bijak untuk memanggil
$article
初始化后检查empty($article)
dan mengendalikan kes tepi apabila ia memang kosong.Ini penyelesaian saya:
Menambah laluan baharu ini dalam
routesweb.php
:Dalam ArticlesController:
Saya hanya akan memuatkan skrip Ajax jika terdapat lebih daripada 10 ulasan:
Skrip: