隐藏没有组合结果的过滤器 |同位素JS

Hide Filters with no result of combination | Isotope JS

我正在使用 Isotope.js 和复选框组合过滤器创建一个应用程序。我正在设法使用示例等让一切正常工作。

但是我发现了一个问题,如何隐藏某些过滤器,这些过滤器不会在过滤器上产生任何结果。

我创建了一个 JSFiddle 来演示我的示例。

过滤选项:

<div id="options">
  <div class="option-set" data-group="brand">
    <input type="checkbox" value=""        id="brand-all" class="all" checked /><label for="brand-all">all brands</label>
    <input type="checkbox" value=".brand1" id="brand1" /><label for="brand1">brand1</label>
    <input type="checkbox" value=".brand2" id="brand2" /><label for="brand2">brand2</label>
  </div>
  <div class="option-set" data-group="type">
    <input type="checkbox" value=""        id="type-all" class="all" checked /><label for="type-all">all types</label>
    <input type="checkbox" value=".type1" id="type1" /><label for="type1">type1</label>
    <input type="checkbox" value=".type2" id="type2" /><label for="type2">type2</label>
  </div>
</div>

项目:

<div id="container">
  <div class="item brand1 type1 red"></div>
  <div class="item brand1 type1 red"></div>  
  <div class="item brand1 type1 red"></div>  
  <div class="item brand2 type2 blue"></div>  
  <div class="item brand2 type2 blue"></div>  
  <div class="item brand2 type2 blue"></div>  
</div>

在我的示例中,我有两个过滤器品牌和类型。如果选择品牌 1 作为过滤器,则只有该品牌的类型 1 可用,因此我想隐藏类型 2 复选框,如果全部选中则反之亦然。

它应该以可扩展的方式用于任何类别而不是硬编码类别。

我已经尝试通过在过滤器上触发同位素本身来实现这一点,但没有奏效。在安排上创建事件也已完成,但仍无法从过滤的项目中获取可用类别。

我尝试使用的排列项目的方法:

$$container.on( 'arrangeComplete', function( event, filteredItems ) {
  filteredItems.forEach(function(elementsData){
console.log($(elementsData.element).attr('class));
});
});

有人可以指导我找到正确的解决方案吗,因为我已经尝试了几个小时不同的激活方式。

试试这个:

    /*jshint browser:true, undef: true, unused: true, jquery: true */

var $container;
var filters = {};

$(function(){

  $container = $('#container');

  var $filterDisplay = $('#filter-display');

  $container.isotope();
  // do stuff when checkbox change
  $('#options').on( 'change', function( jQEvent ) {
    var $checkbox = $( jQEvent.target );
    manageCheckbox( $checkbox );

    var comboFilter = getComboFilter( filters );

    $container.isotope({ filter: comboFilter });

    $filterDisplay.text( comboFilter );
    var comboFilters = comboFilter.split(', ');
    $(comboFilters).each(function(edx, val) {
    var myval = val;
    var hidelist = [];
    var showlist = [];
    $('.option-set input').each(function(edx, ele) {
      var selector = $(ele).attr("value") + myval;


      if(selector !== "" && $(selector).length === 0)
      {
        hidelist.push(ele);
        //$(ele).hide();
        //$("label[for='"+$(ele).attr('id')+"']").hide();
      }
      else {
      showlist.push(ele);
      }

    });
    $(hidelist).each(function(edx, item) {
            $(item).hide();
        $("label[for='"+$(item).attr('id')+"']").hide();
    });
    $(showlist).each(function(edx, item) {
            $(item).show();
        $("label[for='"+$(item).attr('id')+"']").show();
    });
  });

  });

});



function getComboFilter( filters ) {
  var i = 0;
  var comboFilters = [];
  var message = [];

  for ( var prop in filters ) {
    message.push( filters[ prop ].join(' ') );
    var filterGroup = filters[ prop ];
    // skip to next filter group if it doesn't have any values
    if ( !filterGroup.length ) {
      continue;
    }
    if ( i === 0 ) {
      // copy to new array
      comboFilters = filterGroup.slice(0);
    } else {
      var filterSelectors = [];
      // copy to fresh array
      var groupCombo = comboFilters.slice(0); // [ A, B ]
      // merge filter Groups
      for (var k=0, len3 = filterGroup.length; k < len3; k++) {
        for (var j=0, len2 = groupCombo.length; j < len2; j++) {
          filterSelectors.push( groupCombo[j] + filterGroup[k] ); // [ 1, 2 ]
        }

      }
      // apply filter selectors to combo filters for next group
      comboFilters = filterSelectors;
    }
    i++;
  }


  var comboFilter = comboFilters.join(', ');

  return comboFilter;
}

function manageCheckbox( $checkbox ) {
  var checkbox = $checkbox[0];

  var group = $checkbox.parents('.option-set').attr('data-group');
  // create array for filter group, if not there yet
  var filterGroup = filters[ group ];
  if ( !filterGroup ) {
    filterGroup = filters[ group ] = [];
  }

  var isAll = $checkbox.hasClass('all');
  // reset filter group if the all box was checked
  if ( isAll ) {
    delete filters[ group ];
    if ( !checkbox.checked ) {
      checkbox.checked = 'checked';
    }
  }
  // index of
  var index = $.inArray( checkbox.value, filterGroup );

  if ( checkbox.checked ) {
    var selector = isAll ? 'input' : 'input.all';
    $checkbox.siblings( selector ).removeAttr('checked');


    if ( !isAll && index === -1 ) {
      // add filter to group
      filters[ group ].push( checkbox.value );
    }

  } else if ( !isAll ) {
    // remove filter from group
    filters[ group ].splice( index, 1 );
    // if unchecked the last box, check the all
    if ( !$checkbox.siblings('[checked]').length ) {
      $checkbox.siblings('input.all').attr('checked', 'checked');
    }
  }

}

提琴手:https://jsfiddle.net/Lsg4zxu7/45/