当前位置: 首页 > 知识库问答 >
问题:

在Laravel中使用Ajax分页

糜淇
2023-03-14

我对Laravel相当陌生,现在我需要在我的项目中实现ajax功能。我了解了如何通过ajax显示和创建文章,但当我需要列出它们时会出现问题。这有两个子问题。

  1. 显示我所做的分页文章
  2. 和第二个,它正在与新的一组文章切换到下一页。我知道如何使用Laravel的分页来完成此操作,但在本例中,分页也应该使用Ajax来完成。

我从ArticlesController获取了一些数据,它发送了如下所示的json响应:

{
    status: "success", msg: "Hello!", articles: {…}, request: {…}}
    articles:
    current_page: 1
    data: Array(1)
    0: {id: 3, title: "Post1", body: "<p><strong>Lorem ipsum</strong> dolor sit amet, co…ctum. Duis feugiat facilisis lectus a cursus.</p>", created_at: "2019-06-18 00:23:25", updated_at: "2019-06-18 18:33:52", …}
    length: 1
    __proto__: Array(0)
    first_page_url: "http://articleapp.test/postajax?page=1"
    from: 1
    last_page: 3
    last_page_url: "http://articleapp.test/postajax?page=3"
    next_page_url: "http://articleapp.test/postajax?page=2"
    path: "http://articleapp.test/postajax"
    per_page: 1
    prev_page_url: null
    to: 1
    total: 3
    __proto__: Object
    msg: "Hello!"
    request: {_token: "T31VK2FBVbIBG6IIOK4X4Q0r7WPTlzc7haXCwJrM", message: "bravo"}
    status: "success"
    __proto__: Object
}

Controller方法,该方法在接收到来自ajax函数的调用后,收集数据并将其作为json响应发送回。该数据的一部分是分页的文章记录表:

public function ajaks(Request $request){

        if($request->ajax()){
            $articles = Article::with('user')->paginate(1);

            $response = array(
                'status' => 'success',
                'msg' => "Hello!",
                "articles" => $articles,
                "request" => $request->all(),  
            );

            return response()->json($response);

        }

   }

Ajax功能是通过预定路由和csrf令牌一起发送请求,然后接收响应。从这个响应中,它构造了html,然后将其附加到我的布局刀片中的特定div中。她是ajax函数:

function ajaks(/*par*/){
    let token = document.querySelector("meta[name='csrf-token']").getAttribute("content");
    console.log("hit");
    $.ajax({
        url: '/postajax',
        type: 'POST',
        data: {_token: token , message: "bravo"},
        dataType: 'JSON',
        success: (response) => { 
            console.log("success");
            console.log(response);
            let body = "";
            let html = "<div class='container'>";

            let len = response.articles.data.length;
            for(let i=0;i<len;i++){

                html += "<div class='row' style='background-color: whitesmoke;'><div class='col-md-4 col-sm-4'><a href='/articles/"+response.articles.data[i].id+"'><img class='postCover postCoverIndex' src='/storage/images/"+response.articles.data[i].image+"'></a></div><div class='col-md-8 col-sm-8'><br>";

                if(response.articles.data[i].body.length > 400){
                    body = response.articles.data[i].body.substring(0, 400)+"<a href='/articles/"+response.articles.data[i].id+"'>...Read more</a>";
                }
                else{
                    body = response.articles.data[i].body;
                }

                html += "<p>"+body+"</p>";
                html += "<small class='timestamp'>Written on "+response.articles.data[i].created_at+" by "+response.articles.data[i].user.name+"</small></div></div><hr class='hrStyle'>";
            }

            let pagination = "<div class='container'><ul class='pagination justify-content-center'><li class='page-item'><a class='page-link' href='#'>Previous</a></li>";
            for(let i=0;i<response.articles.last_page;i++){
                pagination += "<li class='page-item'><a class='page-link' href='#'>"+(i+1)+"</a></li>";
            }
            pagination += "<li class='page-item'><a class='page-link' href='#'>Next</a></li></ul></div>";


            //console.log(pagination);
            html += "</div>"+"<form id='pagForm'>"+pagination+"</form>";

            if(document.getElementById("maine")){

                    document.getElementById("maine").innerHTML = html;
            }
        },
        error: (response) => {
            console.log("error");
            console.log(response);
        }
    }); 

}

接下来,我将检查ajax路由并获得第一组文章:

<?php
if(Route::getFacadeRoot()->current()->uri()=="ajax"){
?>
<script>
    $(document).ready(function(){
        ajaks();
    });
</script>
<?php
}
?>

它在我的布局刀片里。同样分页链接只是简单的引导,它只是帮助我可视化。我的问题是我如何使用这个分页?使用ajax的正确方法是什么,因为我不能依赖于Laravel的内置分页。我是否应该将另一个ajax函数附加到分页链接上,然后再调用controller方法?当controller方法接收到这样的via请求时,如何在controller方法的分页中使用该请求?

共有1个答案

姜景辉
2023-03-14

实际上,您可以很容易地通过ajax使用Laravel的内置分页,您只需要在请求中传递页面。paginate函数将检测请求的页面并自动处理结果。

function ajaks(p){
    p = typeof p === 'number' && p > 0 ? p : 1;
    let token = document.querySelector("meta[name='csrf-token']").getAttribute("content");
    console.log("hit");
    $.ajax({
        url: '/postajax',
        type: 'POST',
        data: {_token: token , message: "bravo", page: p},
...

正如您所指出的,您还需要捕获分页链接上的点击,停止常规的点击事件,并将其重定向到您的函数,如下所示...

$(document).on('click', '.pagination a', function(e){
  e.preventDefault();
  var p = $(this).attr('href').split('page=')[1];
  ajaks(p);
});

这假定标准的laravel分页链接以page=x作为查询参数。您可以很容易地将其添加到现有的分页例程中,或者我的技巧通常是在我的控制器中呈现html并在我的ajax响应中传回它,如下所示...

$articles = Article::with('user')->paginate(1);
$response = array(
  'status' => 'success',
  'msg' => "Hello!",
  "articles" => $articles,
  "request" => $request->all(),
  'pagination' => (string)$articles->links()
);

然后在浏览器中呈现...

$('#pagination').html(response.pagination);
 类似资料:
  • 本文向大家介绍在Laravel中实现使用AJAX动态刷新部分页面,包括了在Laravel中实现使用AJAX动态刷新部分页面的使用技巧和注意事项,需要的朋友参考一下 AJAX相信大家都不陌生,有很多不同的Javascript Frameworks可以用来快速实现AJAX功能。那么今天我们一起来看一下如何在使用了PHP Frameworks的网站中使用AJAX来刷新页面的一小部分。 这里我使用的是jQ

  • 问题内容: 我想使用ajax删除记录。 视图 控制者 Ajax删除 编辑1 : 如果我只返回console.log(msg),这就是我得到的 事实是,这会删除产品,但只会删除第一行,而不是单击的行。 我要删除单击的产品。 有人可以帮忙吗? 问题答案: 您的问题在这里: 您将只获得第一个,因为您在所有按钮上使用重复的ID。因此,一个ID嘶嘶声查询将使您获得第一个。 如果您在删除控制器中的dd($ i

  • 问题内容: 我是“ AJAX”的新手,我一直在尝试使用“ AJAX”发送请求“ ONSELECT”并在“ laravel 5”中收到“ JSON”响应。 这是我的看法 这是我的控制器来接收ajax请求 这是我的路线 我也尝试过仅用和更改ajax的URL 。 问题答案: 出于安全原因,Laravel 5使用csrf令牌验证....尝试此操作… 在routes.php中 在主布局文件中 var CSR

  • 问题内容: 我正在尝试使用AJAX技术添加评论,但出现错误: 这是我的代码:View: 控制器: AJAX: 最后一条路线: 任何人都知道问题出在哪里,为什么我不能提交表格? 问题答案: 您没有发布任何数据, 您得到的错误是DB中的列不能为空。 尝试将您的ajax调用更改为此: 改变这个 至 并获取消息和帖子ID: 完成ajax块: 最后,在隐藏字段中添加一个ID: 从Laravel控制器发送回数

  • 本文向大家介绍Laravel+jQuery实现AJAX分页效果,包括了Laravel+jQuery实现AJAX分页效果的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Laravel+jQuery实现AJAX分页效果。分享给大家供大家参考,具体如下: JavaScript部分: php控制器部分: 更多关于Laravel相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》

  • 我试图通过AJAX Laravel(jquery AJAX)发送图像上传。我总是收到空的$_files数组。我在Form中添加了enctype=“multipart/form-data。当我通过Laravel的post方法发送数据时,我得到了我的数据。这不适用于jquery ajax。我得到的是除了$_文件之外我发送的其他东西的ajax响应。