Кнопка DataTables фильтрует данные атрибута html - PullRequest
0 голосов
/ 03 июля 2018

Я использую плагин DataTables для таблицы начальной загрузки 4 с динамической информацией (https://datatables.net/). Я получаю информацию из разных API, строю объект и добавляю в таблицу.

Все работает нормально, но я хочу иметь возможность создавать некоторые кнопки фильтров для вещей, которые НЕ отображаются пользователю в таблице.

У меня есть несколько столбцов, которые я могу использовать для упорядочивания / поиска (таблицы данных по умолчанию), но я хочу иметь возможность фильтрации по HTML-атрибутам области данных и субрегиона данных. Я читал о поиске данных из плагина DataTables, но, так как мне нужно более 1 фильтра (как я уже сказал, из -region & -subregion будет началом, но, вероятно, будет расширяться), это не очень полезно для меня.

Моя идея состоит в том, чтобы создать выпадающее меню (для наглядности) и связать кнопки с фильтром. Фильтр проверит, какая кнопка была нажата (текст кнопки), и отфильтрует всю таблицу на ее основе (например, поиск, но для атрибутов данных html).

Я пытался весь день искать что-то подобное и ничего не нашел .... Надеюсь, кто-то здесь использовал подобные DataTables и может подсказать, как это сделать.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Возможно, есть более элегантный способ сделать это как плагин JQuery & DataTables, но это просто и работает.

Вот HTML-код таблицы:

<table style="width:100%;border-collapse:collapse;border:solid 1px black;">
        <thead>
            <tr>
                <th>Column 1</th>
                <th>Column 2</th>
            </tr>
        </thead>
        <tbody>
            <tr data-region="1" data-subregion="a">
                <td>Region 1</td>
                <td>Sub-Region A</td>
            </tr>
            <tr data-region="1" data-subregion="b">
                <td>Region 1</td>
                <td>Sub-Region B</td>
            </tr>
            <tr data-region="2" data-subregion="a">
                <td>Region 2</td>
                <td>Sub-Region A</td>
            </tr>
            <tr data-region="2" data-subregion="b">
                <td>Region 2</td>
                <td>Sub-Region B</td>
            </tr>
            <tr data-region="2" data-subregion="c">
                <td>Region 2</td>
                <td>Sub-Region C</td>
            </tr>
            <tr data-region="3" data-subregion="a">
                <td>Region 3</td>
                <td>Sub-Region A</td>
            </tr>
        </tbody>
    </table>

Настройте DataTables и добавьте свои пользовательские элементы для фильтрации.

$(document).ready(function(){

        // Execute the DataTables API on the table(s)
        $('table').DataTable();

        // give the DataTables API a moment to finish drawing elements to the DOM
        setTimeout(function(){
            // Just adding some Dropdown lists, but you can add a custom search box
            // this first one filters by the data-region attribute
            var regionFilter = $('<select data-filter="region">'
                + '<option value="0">All Regions</option>'
                + '<option value="1">Region 1</option>'
                + '<option value="2">Region 2</option>' 
                + '<option value="3">Region 3</option>' 
                + '</select>');
            // this second one filters by the data-subregion attribute
            var subregionFilter = $('<select data-filter="subregion">'
                + '<option value="0">All Sub-Regions</option>'
                + '<option value="a">Sub-Region A</option>'
                + '<option value="b">Sub-Region B</option>' 
                + '<option value="c">Sub-Region C</option>' 
                + '</select>');
            // prepend the dropdown lists into the dataTables_filter container
            // optionally, you can overwrite the default search box that the DataTables API places here
            $('.dataTables_filter').prepend(regionFilter);
            $('.dataTables_filter').prepend(subregionFilter);
            // give your own HTML a moment to draw to the DOM
            setTimeout(function(){
                // configure the selection to trigger the filter action
                $('select[data-filter]').on('change', function(){
                    // the <select> element has a data-filter attribute which defines which attribute to search the table for
                    var dataFilter = $(this).attr('data-filter');
                    var keyword = $('select[data-filter="' + dataFilter + '"] option:selected').val();
                    // execute the search
                    searchDataAttributes(dataFilter, keyword);
                });
            }, 300);
        }, 400);

    });

Создайте собственную реализацию поиска

// This search is very simple - you can implement any type of search you like
    function searchDataAttributes(attribute, keyword) {
        // put together the attribute to search
        var dataAttribute = 'data-' + attribute;
        // the value 0 is being used to show all
        if (keyword=='0') {
            $('tbody tr').show();
            return true;
        }
        // if the keyword is not 0, then look at the attributes of each row in the table
        $('tbody tr').each(function(){
            var attributeValue = $(this).attr(dataAttribute);
            // if the value of the attribute in the row matches the value of the keyword, then show the row
            if (attributeValue==keyword) {
                console.log('show');
                $(this).show();
            } else {
                console.log('hide');
                $(this).hide();
            }
        });
    }

Это простой фильтр выпадающего списка. Вы можете заменить окно поиска на свое собственное поле поиска, которое выполняет поиск так, как вы хотите. Вы не должны позволять DataTables рисовать свое поле поиска вообще, если вы не хотите. Это только один из способов обойти ограничения DataTables из коробки.

0 голосов
/ 05 июля 2018

Ну, я не нашел способа сделать это, поэтому я сдался. Я создал несколько новых столбцов с информацией, которую я ранее хранил в атрибуте data. Я спрятал столбцы и использовал ссылку на таблицу для API

table.columns(colnumber).search('text').draw()

Не красиво, но работает, поэтому я не собираюсь тратить больше времени на поиск другого подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...