Пользовательский фильтр Vue Tables 2 не работает

В настоящее время я работаю над таблицей, в которой отображаются данные журналов из разных приложений. Таблица показывает данные без проблем, так как это, казалось бы, было легким для подъема.

Теперь мне нужен собственный фильтр. Этот фильтр должен выделять строки красным цветом, если значение в LogType равно 1 (например, журналы, которые являются исключениями / ошибками). Однако я не смог заставить работать настраиваемый фильтр после прочтения их документации. И другие сообщения о пользовательских фильтрах, которые я мог найти в Stackoverflow, где, кажется, есть исправление, но, похоже, это не сработало для меня. (например, Таблицы Vue 2 - Пользовательские фильтры)

Что касается документации по таблицам Vue 2, может быть, я просто не понимаю, что они на самом деле означают. Как в том, что нужно, чтобы это работало. (vue-tables-2 - Документация по пользовательским фильтрам)

Я чувствую, что моя проблема может заключаться в том, что фильтр в примере нужно активировать нажатием кнопки. Где, как у меня, нужно начинать, как только появятся данные для фильтрации. Но я совершенно не уверен, так как я не могу заставить настраиваемый фильтр запускать «console.log ()», который я поместил внутрь, чтобы посмотреть, какие данные он возвращает.

Следующий код - это мой код и параметры Vue. Метод getErrorLogs (false), вызываемый в начале, вызывает вызов AJAX, который возвращает данные, которые передаются в таблицу, которая работает должным образом.

    getErrorLogs(false)

    const ClientTable = VueTables.ClientTable
    const Event = VueTables.Event 

    Vue.use(ClientTable)

    vue = new Vue({
        el: "#vueErrorLogs",
        methods: {
            applyFilter(number) {
                this.selectedNumber = number;
                Event.$emit('vue-tables.filter::exceptions', number);
            }
        },
        data: {
            numbers: ['0','1'],
            selectedNumber: '',
            columns: ['ActionName', 'Message', 'LogTime', 'ID', 'LogType', 'Area', 'ApplicationUser'],
            data: {
                tableData: getData()
            },
            options: {
                headings: {
                    ActionName: 'Action Name',
                    Message: 'View Record',
                    LogTime: 'Log Time',
                    ID: 'ID',
                    LogType: 'Log Type',
                    Area: 'Code Area',
                    ApplicationUser: 'Application User',
                },
                sortable: ['ActionName', 'Message', 'ID', 'LogTime', 'LogType', 'Area', 'ApplicationUser'],
                filterable: ['ActionName', 'Message', 'ID', 'LogType', 'Area', 'ApplicationUser'], //LogTime is missing since datepicker dosent work
                perPage: 20,
                filterByColumn: true,
                toMomentFormat: true,
                orderBy: {
                    column: 'LogTime',
                    ascending: false
                },
                customFilters: [{
                    name: 'exceptions',
                    callback: function (row, query) {
                        console.log("Row: ", row, " Query: ", query)
                        return row.name[0] == query;
                    }
                }]
            }
        }
    });

    function getData() {
        var data = [{}]
        return data;
    }

Эта часть моего кода представляет собой HTML-код, используемый для отображения таблицы vue.

<div id="vueErrorLogs">
    <v-client-table :columns="columns" :data="data.tableData" :options="options">
        <a slot="uri" slot-scope="props" target="_blank" :href="props.row.uri" class="glyphicon glyphicon-eye-open"></a>
    </v-client-table>
</div>

Обновление 1: до сих пор мне удалось исключить, что я не могу использовать v-bind: class для установки тегов, чтобы получить классы начальной загрузки «Успех, опасность или информация», назначенные им как хочу.

Обновление 2: я нашел решение моей проблемы добавления цвета к тегам TR с помощью классов начальной загрузки, просто использовать параметр rowClassCallBack и выполнять проверку внутри вызова функции, а затем возвращать желаемое строковое имя класса. Такие как :

rowClassCallback: function (row) {
                    if (row.LogType == 1)
                        return 'danger'
                    else
                        return 'default'
                },

Я до сих пор не знаю, почему моя доза специального фильтра не работает.


person Carsten    schedule 05.12.2017    source источник
comment
Я борюсь с точно такой же проблемой. Неправда, что настраиваемый фильтр не работает. На самом деле это так, однако, если вы посмотрите на очередь событий, похоже, что после vue-tables.filter::myfilter запускаются два других события: vue-tables.filter::defaultfilter и filter::defaultfilter, генерируемые <Root> и <ClientTable> соответственно. Итак, я предполагаю, что просто наш настраиваемый фильтр заменяется фильтром по умолчанию. Есть подсказка?   -  person ibanjo    schedule 14.12.2017
comment
Более того, в вашем случае похоже, что метод applyFilter никогда не вызывается. Вы должны подключиться к событию фильтрации по умолчанию, например, vue-tables.filter::defaultColumnName. Вы можете сделать это, добавив Event.$on('vue-tables.filter::defaultColumnName', (payload) => {vue.applyFilter(payload)});   -  person ibanjo    schedule 14.12.2017


Ответы (1)


  • Как следует из их названия, пользовательские фильтры используются для фильтрации строк, а не для изменения их атрибутов (т.е. в вашем случае добавление класса tr для сопоставления данных строки)
  • Как заметил @ibanjo, вы никогда не генерируете событие, которое активирует настраиваемый фильтр, поэтому он не работает.
  • Как вы сами выяснили, правильный вариант - rowClassCallback
person Matanya    schedule 02.01.2018