【问题标题】:Laravel AJAX search and display postsLaravel AJAX 搜索和显示帖子
【发布时间】:2023-03-24 14:18:01
【问题描述】:

我想用 Laravel 创建一个 AJAX 搜索。我被困在显示控制器返回的结果(帖子)的部分。到目前为止,我有这个:

搜索表单(home.blade.php)

//The search form
{{ Form::open(array('id' => 'search', 'url' => ' ')) }}
    {{ Form::text('query', Input::old('query'), array('placeholder' => 'Search for posts..')) }}
    {{ Form::hidden('sort_col', Input::old('sort_col')) }}
    {{ Form::hidden('sort_dir', Input::old('sort_dir')) }}
    {{ Form::button('<i class="fa fa-search"></i>', array('type' => 'submit', 'name' => 'submit', 'title' => 'Zoeken')) }}
{{ Form::close() }}

显示帖子 (home.blade.php)

<!-- Posts !-->
<div id="posts">
@if (!$posts->count())
    <div class="content">No posts found!</div>
@else
    @foreach ($posts as $post)
        <div class="list-item clearfix">
            <div class="content">
                <img src="{{ URL::to($post->thumbnail) }}" alt="" />
                <h1>{{{ $post->title }}}</h1>
                <div class="tags">
                @foreach ($post->tags as $tag)
                    <abbr title="{{{ $tag->description }}}">{{{ $tag->title }}}</abbr>
                @endforeach
                </div>
            </div>
            <div class="score">
                {{ $post->rating }}
            </div>
        </div>
    @endforeach
@endif
</div>
<!-- /Posts !-->

HomeController.php

public function postSearch()
{
    if (!Request::ajax()) {
        return null;
    }

    $input = array(
        'query'    => Input::get('query'),
        'sort_col' => Input::get('sort_col'),
        'sort_dir' => Input::get('sort_dir'),
    );

    $posts = new Post;
    $posts = $posts->select(...)->where(...)->orderBy(...); //Search query here

    Input::flash();

    return $posts;
}

在提交搜索时调用postSearch() 方法。

jQuery (home.blade.php)

$('#search').submit(function(e) {
    e.preventDefault();

    var form = $(this);

    $.post(form.attr('action'), form.serialize(), function(data) {
        $('#posts').html(data);
        console.log(data);
    });
});

一切正常,正在返回数据。当我将数据记录到控制台时,它看起来像这样:

红框中的对象是帖子。如何在#posts div 中显示这些帖子?我一直在苦苦挣扎,但我就是想不通。

【问题讨论】:

  • 嘿,您期待来自控制器的 HTML,但您的控制器正在返回 JSON 数据。因此,您需要使用 jQuery 解析 JSON 或更改控制器以返回生成的 html 并将其注入 DOM。

标签: jquery ajax search post laravel


【解决方案1】:

您必须遍历帖子数组并创建必要的 jquery 元素。
这应该给你的想法:

for(var i=0; i<data.length; i++){
    var post = data[i];
    var listItem = $('<div></div>').addClass('list-item clearfix');
    var content = $('<div></div>').addClass('content');
    var img = $('<img/>').attr('src', post.thumbnail);
    var h1 = $('<h1></h1>').text(post.title);
    // etc

    content.append(img).append(h1);
    listItem.append(content);
    $('#posts').append(listItem);
}

更新

对于您的图片网址,您可以在控制器中执行以下操作:

public function postSearch()
{
    // ... code omitted

    foreach($posts as $post){
        $post->thumbnail = URL::to($post->thumbnail);
    }

    return $posts;
}

这会将 thumbnail 属性替换为生成的完整 url,您可以在客户端上使用它。

【讨论】:

  • 谢谢,我设法让它通过一些调整工作。但是有两个问题。 1:分页不工作。 2:我怎样才能用jQuery&lt;img src="{{ URL::to($post-&gt;thumbnail) }}" /&gt;生成这个HTML?。
  • 1:由于您使用 javascript 附加项目,因此 laravel 服务器端分页将不再起作用。我建议您也使用 jquery 进行分页(我确定有插件)
  • 2:您可以在控制器中生成完整的 url。通过遍历所有帖子并存储使用 URL::to 生成的 img url
  • 我会自己解决第一个问题,它与这个问题并没有真正的关系。 2:但是我应该在 HomeController 中生成所有 HTML 并将其返回显示。这不是坏习惯吗?我还发现这行得通var html = '&lt;img src="{{ URL::to('image') }}" /&gt;',但我无法获得一个 javascript 变量来替换“图像”。
  • 不,我不会认为这是不好的做法。客户端渲染虽然带来了一些优势。例如,您可以更轻松地动画添加列表项...我个人更喜欢使用 json 进行通信。关于“图像问题”,我稍后会更新我的答案......
猜你喜欢
  • 2016-09-15
  • 2013-02-13
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2019-05-07
相关资源
最近更新 更多