Фильтрация динамических данных с MixItUp

Я пытаюсь отфильтровать данные, которые динамически создаются в методе обратного вызова AJAX, используя MixItUp. У меня есть 10 разделов, каждый из которых имеет один или несколько фильтров. Проблема, с которой я сталкиваюсь, заключается в том, что когда я щелкаю по фильтру одного раздела, все остальные данные секций скрываются. Когда я проверял DOM, переопределение для отображения ни одного из них не блокировалось. Значения фильтра все уникальны.

    // The "bindHandlers" method will listen for whenever a button is clicked. 
bindHandlers: function () {
    var self = this;
    self.$filters.on('click', 'a', function (e) {
        self.parseFilters();
    });
},

parseFilters: function () {
    var self = this;
    // loop through each filter group and grap the active filter from each one.
    for (var i = 0, group; group = self.groups[i]; i++) {
        group.active = [];
        group.$inputs.each(function () {
            if ($(this).find('.selected').length > 0) {
                group.active.push($(this).attr('data-filter'));
            }
        });
    }
    self.concatenate();
},

concatenate: function () {
    var self = this;

    self.outputString = ''; // Reset output string

    for (var i = 0, group; group = self.groups[i]; i++) {
        self.outputString += group.active;
    }

    // If the output string is empty, show all rather than none:    
    !self.outputString.length && (self.outputString = 'all');

    // Send the output string to MixItUp via the 'filter' method:    
    if (self.$container.mixItUp('isLoaded')) {
        self.$container.mixItUp('filter', self.outputString);
    }
}

Приведенный выше код написан в функции обратного вызова AJAX, и событие click запускает функцию parseFilter и достигает concatenate, а outputString содержит правильное имя фильтра, но при этом скрывает все остальные фрагменты секций, что меня смущает.

Может кто-нибудь мне помочь. Насколько я понял из моего поиска в Google, мы должны установить фильтр данных с одним значением и дать то же значение, что и имя класса фильтруемого элемента. Также я использую Knockout для привязки данных

1 ответ

Решение

Наконец я смог сделать это. Я не знаю, это идеальное решение и все, но я сделал это так.

Для каждого раздела, где есть два элемента div, один для кнопок фильтра и второй для листов отчета, я дал уникальный класс (фильтр div) и id (плитки отчета), а в функции обратного вызова AJAX я связал код следующим образом

function SetSectionOneData() {

var $container = $('#SectionOneReports'), // Report tiles holding container id. 
$controls = $('.cd-tab-filter');  // Filter button holding div

$container.mixItUp({
    animation: {
        duration: 700,
        effects: 'fade translateY(600%) stagger(35ms)',
        easing: 'cubic-bezier(0.86, 0, 0.07, 1)',
        reverseOut: true
    },
    controls: {
        enable: false
    }
});

$controls.on('click', '.filter', function () {
    var $btn = $(this),
        filter = $btn.attr('data-filter');
     $btn.addClass('FltrBtn_active'); 
    var btnId = $btn.attr('id');
    if (btnId) {
        var productId = btnId.split('_')[1];
        var linkId = btnId.split('_')[2];
        $('*[id*=Filter_' + productId + ']:visible').each(function () {
            if ($(this).attr('id').split('_')[2] != linkId) {
                $(this).removeClass('FltrBtn_active');
            }
        });
    }
    $container.mixItUp('filter', 'none', function () {
        $container.mixItUp('filter', filter);
    });
});

}

Если кто-то обнаружит, что есть лучшее / оптимизированное решение, пожалуйста, дайте мне знать.

В любом случае спасибо всем

Другие вопросы по тегам