Обработчик событий для активных / неактивных фильтров YADCF

Я использую Datatables 1.10 и YADCF 0.8.9.beta.24.

Мои входные данные фильтра отображаются в раскрывающемся меню внутри каждой таблицы th, Я хочу показать / скрыть значок активного фильтра в th где применяется фильтр, но я не знаю, как правильно реагировать на любое событие изменения / выбора / удаления с помощью различных типов фильтров YADCF, особенно с помощью кнопки очистки YADCF. (Я использую select2, text, range_date а также auto_complete).

Что я пробовал:

$('#my-table thead').on('change', function(e) {
  if( $(e.target).val() ) {
    $(e.target).closest('th').addClass('filtered_col');
  } else {
    $(e.target).closest('th').removeClass('filtered_col');
  }
});

//Change event triggers when selecting with 'select2' 
//and when removing items with Select2 remove button, 
//works also selecting with 'auto_complete' filters 
//but not whith any YADCF clear button 
//or when selecting with type 'text' or 'range_date'.

Я пытался с определенными обработчиками событий для фильтров Select2 ("выбор" и "удаление"), но они не запускаются при использовании кнопки очистки YADCF.

Я также попробовал:

oTable.on( 'search.dt', function() {
    $(this).find('th').each(function() {
      if ( $(this).find('.select2-search-choice').length || $(this).find('.inuse').length ) {
        $(this).addClass('filtered_col');
      } else {
        $(this).removeClass('filtered_col');
      }
    });
});

//It works selecting with 'auto_complete' and with 'text' types.
//and with respective YADCF Clear button.
//also selecting with 'select2' type and clearing with Select2 clear button,
//but NOT clearing select2 with YADCF clear button 
//'range_date' is not being targeted here.

Итак, как я могу реагировать на активные фильтры, чтобы показать и скрыть активный значок, когда пользователь фильтрует каждый столбец?

РЕДАКТИРОВАТЬ: Как предложено в @Daniel's Answer (спасибо:), я пытался слушать DOMSubtreeModified:

  $('#main_container').find('.yadcf-filter-wrapper').bind('DOMSubtreeModified', function(e) {
    if( $(e.target).closest('th').find('.select2-search-choice').length || $(e.target).closest('th').find('.inuse').length ) {
      $(e.target).closest('th').addClass('filtered_col');
    } else {
      $(e.target).closest('th').removeClass('filtered_col');
    }

  });
  //Event is only firing with 'select2' filtering and clearing
  //No other filter types are firing this event, although one CSS class is being added in 'text' filters.

Итак, я попытался изменить JQuery addClass / removeClass, чтобы заставить их вызвать некоторые события (как предложено в этом ответе):

  (function(){
    var originalAddClass = jQuery.fn.addClass;
    var originalRmvClass = jQuery.fn.removeClass;
    jQuery.fn.addClass = function(){
      // Execute the original method.
      var result = originalAddClass.apply( this, arguments );
      // trigger a custom event
      jQuery(this).trigger('cssClassAdded');
      // return the original result
      return result;
    }
    jQuery.fn.removeClass = function(){
      var result = originalRmvClass.apply( this, arguments );
      jQuery(this).trigger('cssClassRmvd');
      return result;
    }
  })();

  // And then..
  $(function() {
    $('.yadcf-filter-wrapper').on('cssClassAdded', function(){ 
      if( $(this).closest('th').find('.select2-search-choice').length || $(this).closest('th').find('.inuse').length ) {
        $(this).closest('th').find('.fa-filter').css('display', 'block');
      }
    });
    $('.yadcf-filter-wrapper').on('cssClassRmvd', function(){ 
      if( !$(this).closest('th').find('.select2-search-choice').length && !$(this).closest('th').find('.inuse').length ) {
        $(this).closest('th').find('.fa-filter').css('display', 'none');
      }
    });
  });
  //This is the best approach, since is working with 'text', 'select2' and 'auto_complete', with both filtering and clearing actions.
  //'range_date' is the only one I still need to cover.

Как уже говорилось, в этом последнем примере я мог бы решить проблему во всех типах фильтров, кроме 'range_date'. Единственная идея, которая у меня сейчас есть, как предложила @Daniel, - изменить YADCF, чтобы ввести некоторый класс в этом случае (по причинам, связанным с производством, я бы хотел этого избежать).

Я ожидал, что класс 'inuse' также будет добавлен в range_date фильтры. Это помогло бы с моим последним подходом. Неужели YADCF так спроектирован, чтобы вводить этот класс только в некоторые типы фильтров, а не во все? Может я что-то упустил?

Я все еще был бы признателен за лучшее решение для решения этой проблемы, особенно для 'range_date', которое я никак не мог решить.

Спасибо

2 ответа

Я знаю, что это старый вопрос, но я нашел другой (и более простой) способ архивировать это. Может быть, это помогает кому-то еще.

Просто подключите событие "draw" из таблицы данных и добавьте / удалите класс css в зависимости от oSavedState.columns...

    $('#my-table').on('draw.dt', function (e, oSettings) {
            var th = $('tr th',this); // find all TH elements of current table

            $.each(oSettings.oSavedState.columns, function( index, col ) {
                if (th.length > index){
                    if (col.search && col.search.search != ""){ // filter is active
                        $(th[index]).addClass('filtered_col'); // add class to col's TH
                    } else {
                        $(th[index]).removeClass('filtered_col'); // remove class from col's TH
                    }
                }
            });
        });

Отдых это css...

Должен работать с использованием любого фильтра-плагина или даже вручную добавленных фильтров.

ОБНОВИТЬ:

Если вы не используете stateSave для своей таблицы данных (или даже тогда - она ​​еще короче), может быть лучше использовать aoPreSearchCols вместо oSavedState.columns:

    $('#my-table').on( 'draw.dt', function (e,oSettings) {
        var th = $('tr th',this);
        $.each(oSettings.aoPreSearchCols, function( index, search ) {
            if (th.length > index){
                if (search.sSearch != ""){
                    $(th[index]).addClass('col-filtered');
                } else {
                    $(th[index]).removeClass('col-filtered');
                }
            }
        });
    });

Вы можете попытаться прослушать событие dom change фильтров, потому что при использовании фильтра yadcf добавляет класс inuse к фильтру и когда фильтр очищается inuse класс удаляется, он будет работать для большинства фильтров (кроме select2), для select2 вы можете исправить yadcf, чтобы добавить / удалить inuse класс для фильтра выбора (не видимый, а исходный, который получает select2-offscreen класс, когда создается select2)

Например

$('.yadcf-filter').bind('DOMSubtreeModified', function(e) {
      alert('class changed');
});
Другие вопросы по тегам