试图将多个值推入数组(Isotope)

时间:2016-02-16 17:45:53

标签: javascript arrays jquery-isotope

我正在使用Isotope作为花哨布局中链接内容的分类组织者。我正在尝试将多个值推入数组,以便显示过滤器触及的所有项目。然而,最终结果只是显示数组中的最新项而不是总和。最初,我将所有值都推送到字符串中,然后将x声明为最终结果 - 我意识到这不是解决这个问题的方法,并且已经修改过它。我正在推入一个数组,而不是一个字符串,希望加入每个值,以便它们全部显示出来。但是,我仍然只获得最新的选定值。 JS就在下面。

  // store filter for each group
  var filters = {};

  $('.filters').on('click', '.button', function() {
    var filters = [];
    // var filters = '';
    var selected = $(this).data('selected');
    var group = $(this).data('group');
    var currentFilter = $(this).data('filter');

    // toggle function along with having multiple selectors
    if(selected == "0") {
      filters.push($(this).data('filter'));
      filters = filters.join(', ');
      // filters = $(this).data('filter');
      $(this).data('selected', "1");
      $(this).addClass('is-checked')
    }
    else {
      $(this).data('selected', "0");
      $(this).removeClass('is-checked')
    }

    // set filter for Isotope
    $grid.isotope({
      filter: filters
    });

    // flatten object by concatting values
    function concatValues(obj) {
      var value = '';
      for (var prop in obj) {
        value += obj[prop];
      }
      return value;
    }
  });
}());

我还为摆弄设置了codepen。感谢您提出的任何建议。甚至指向我可能错过的文档或教程将是一个很大的帮助。现在,我正在研究这个我正在拍摄的jsfiddle,看看如何修改我的代码以更好地适应这里发生的事情。

2 个答案:

答案 0 :(得分:1)

上周我也花了很多时间。 :)幸运的是我发现了Desandro的编码器http://codepen.io/desandro/pen/owAyG/ 希望有所帮助。

$( function() {

  // filter functions
  var filterFns = {
    greaterThan50: function() {
      var number = $(this).find('.number').text();
      return parseInt( number, 10 ) > 50;
    },
    even: function() {
      var number = $(this).find('.number').text();
      return parseInt( number, 10 ) % 2 === 0;
    }
  };

  // init Isotope
  var $container = $('.isotope').isotope({
    itemSelector: '.color-shape',
    filter: function() {
      var isMatched = true;
      var $this = $(this);

      for ( var prop in filters ) {
        var filter = filters[ prop ];
        // use function if it matches
        filter = filterFns[ filter ] || filter;
        // test each filter
        if ( filter ) {
          isMatched = isMatched && $(this).is( filter );
        }
        // break if not matched
        if ( !isMatched ) {
          break;
        }
      }
      return isMatched;
    }
  });

  // store filter for each group
  var filters = {};

  $('#filters').on( 'click', '.button', function() {
    var $this = $(this);
    // get group key
    var $buttonGroup = $this.parents('.button-group');
    var filterGroup = $buttonGroup.attr('data-filter-group');
    // set filter for group
    filters[ filterGroup ] = $this.attr('data-filter');
    // arrange, and use filter fn
    $container.isotope('arrange');
  });

  // change is-checked class on buttons
  $('.button-group').each( function( i, buttonGroup ) {
    var $buttonGroup = $( buttonGroup );
    $buttonGroup.on( 'click', 'button', function() {
      $buttonGroup.find('.is-checked').removeClass('is-checked');
      $( this ).addClass('is-checked');
    });
  });

});

答案 1 :(得分:1)

这是我最终解决的问题。

我提出了一个单独的解决方案,但这是一支很棒的笔。我希望我以前见过它。

$(document).ready(function() {   
// init Isotope   
var $grid = $('.grid').isotope({
  itemSelector: '.element-item',
  layoutMode: 'fitRows',
  fitRows: {
    gutter: 27
  }   
});

// store filter for each group   
var filters = [];

$('.filters').on('click', '.button', function() {

  var filterstring = '';
  var selected = $(this).data('selected');
  var currentFilter = $(this).data('filter');


  // toggle function along with having multiple selectors
  if (selected == "0") {
    filters.push( currentFilter );
    $(this).data('selected', "1");
    $(this).addClass('is-checked')
  } else {
    $(this).data('selected', "0")
    $(this).removeClass('is-checked')

    var filtername = $(this).data('filter')
    var i = filters.indexOf(filtername)
    filters.splice(i, 1)
  }
  filterstring = filters.join(', ');
    // set filter for Isotope
    $grid.isotope({
      filter: filters.join("")
     });   
   }); 
 });