Laravel 复选框过滤器 ajax

Posted

技术标签:

【中文标题】Laravel 复选框过滤器 ajax【英文标题】:Laravel checkbox filter ajax 【发布时间】:2015-08-05 12:05:33 【问题描述】:

我需要实现一个基于 ajax 的空缺复选框过滤器。所以我在页面上有一些类别,当用户标记一些复选框时,结果块只显示所选类别中的空缺。如果没有选中的复选框页面显示所有类别的所有职位空缺。

现在我有了我当前的变体,但它不适用于复选框值数组,并且每次加载结果后复选框状态都会重置。

我现在拥有的:

我的 html 标记

    <div class="category">
        <input type="checkbox" name="category[]" id="cat1" value="1" style="display: none;">
        <label for="cat1" class='cat-check'>Category-1</label>
    </div>
    <div class="category">
        <input type="checkbox" name="category[]" id="cat2" value="2" style="display: none;">
        <label for="cat2" class='cat-check'>Category-2</label>
    </div>
    <div class="category">
        <input type="checkbox" name="category[]" id="cat3" value="3" style="display: none;">
        <label for="cat3" class='cat-check'>Category-3</label>
    </div>

这是我的 search.js

    $(document).ready(function () 

    $(':checkbox').click(function (e) 

        e.preventDefault();

        var cat = $(':checkbox:checked').val();

            $.post('/vacancies/searchcat', cat: cat, function(markup)
            
                $('#search-results').html(markup);
            );            

        console.log(cat);

        );

);

控制器

    public function searchcat()


    $cat = \Input::get('cat');

    $cat = (int) $cat;

    $vacancies = \Vacancy::where('category_id', '=', $cat)->get();

    return \View::make('vacancies.empty')->with('vacancies', $vacancies); 


和路线

Route::post('/vacancies/searchcat', 'SearchController@searchcat');

现在请您为我的情况提供一些可行的示例。

更新 2 新 .JS:

$(document).ready(function () 

var categories = [];

// Listen for 'change' event, so this triggers when the user clicks on the checkboxes labels
$('input[name="category[]"]').on('change', function (e) 

    e.preventDefault();
    categories = []; // reset 

    $('input[name="category[]"]:checked').each(function()
    
        categories.push($(this).val());
    );

    $.post('/vacancies/searchcat', categories: categories, function(markup)
    
        $('#search-results').html(markup);
        var count = $('#count').val(); // vacancies count, from hidden input   
        $(".page-title").html("(" + count + ")");            
    );            

);

);

【问题讨论】:

【参考方案1】:

首先,为您的复选框赋予相同的名称(数组表示法)和一个值:

<div class="category">
    <input type="checkbox" name="cat[]" value="1" id="cat1" style="display: none">
    <label for="cat1" class='cat-check'>Category-1</label>
</div>
<div class="category">
    <input type="checkbox" name="cat[]" value="2" id="cat2" style="display: none;">
    <label for="cat2" class='cat-check'>Category-2</label>
</div>
<div class="category">
    <input type="checkbox" name="cat[]" value="3" id="cat3" style="display: none;">
    <label for="cat3" class='cat-check'>Category-3</label>
</div>

在 search.js 中,遍历所有选中的复选框并收集数组中的值。然后这个数组将被发布到服务器:

$(document).ready(function () 

    var categories = [];

    // Listen for 'change' event, so this triggers when the user clicks on the checkboxes labels
    $('input[name="cat[]"]').on('change', function (e) 

        e.preventDefault();
        categories = []; // reset 

        $('input[name="cat[]"]:checked').each(function()
        
            categories.push($(this).val());
        );

        $.post('/vacancies/searchcat', categories: categories, function(markup)
        
            $('#search-results').html(markup);
        );            

    );

);

在您的控制器方法中,您可以获取类别数组并构建where in 查询:

public function searchcat()

    $categories = \Input::get('categories');

    $vacancies = \Vacancy::whereIn('category_id', $categories)->get();

    return \View::make('vacancies.empty')->with('vacancies', $vacancies); 

【讨论】:

它有效,但它只显示来自 1 个类别的空缺,当我标记第二个复选框时,它只显示来自第 2 个类别的记录。似乎页面刷新,它正在丢失先前复选框的值。如何实现多选? 更新:刚刚添加了提交按钮,一切正常,但我需要在没有提交按钮的情况下执行此过滤器。 好的,我编辑了我的答案以满足您的要求。我将$('input[name="cat[]"]') 上的点击事件更改为更改事件。我刚刚意识到您的复选框隐藏在您的示例中,所以现在即使您单击复选框标签,事件也会触发。 一切正常,但我不明白为什么 ajax 总是发送 2 个帖子请求而不是 1 个? 能否请您编辑您的问题并提供更多代码(JS 部分)?

以上是关于Laravel 复选框过滤器 ajax的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel php 中的复选框使用 ajax 更新多条记录?

使用带有多选复选框的 Ajax 帖子过滤器获取帖子

数据表复选框不适用于ajax

如何自动将查询字符串附加到 laravel 分页链接?

初始化jplist后如何添加复选框过滤器项

PHP、AJAX、MySQL 的复选框过滤以及 AND/OR 之间的切换