web-dev-qa-db-fra.com

Récupération des données de ligne après avoir filtré les données JQuery

On dirait que ça devrait être facile mais ...

Est-ce que quelqu'un sait comment renvoyer les lignes actuelles d'un dataTable filtré? La méthode oTable.fnGetNodes() retourne all rows, où je veux juste celles filtrées (visibles, mais paginées) 

// filter on division
var oTable = $('#summary-table').dataTable();
oTable.fnFilter(division_text, 2, true);

// Get the nodes from the table  
var nNodes = oTable.fnGetNodes(); // <-- still retrieves original list of rows

J'ai vérifié: Récupérer des données visibles de Datatables mais pas beaucoup d'aide là-bas.

14
proggrock

Compris la réponse, si jamais quelqu'un en avait besoin: 

Tout d’abord, en utilisant cette extension datatables pour obtenir toutes les lignes cachées: 

$.fn.dataTableExt.oApi.fnGetHiddenTrNodes = function (oSettings, arg1, arg2) {

/* Note the use of a DataTables 'private' function thought the 'oApi' object */

var anNodes = this.oApi._fnGetTrNodes(oSettings);
var anDisplay = $('tbody tr', oSettings.nTable);

/* Remove nodes which are being displayed */
for (var i = 0; i < anDisplay.length; i++) {
    var iIndex = jQuery.inArray(anDisplay[i], anNodes);

    if (iIndex != -1) {
        anNodes.splice(iIndex, 1);
    }
}

/* Fire back the array to the caller */
return anNodes;
}

Puis filtrez les nœuds cachés pour obtenir uniquement les nœuds visibles:

 var rows = oTable.fnGetNodes(); // get all nodes            
 var rows_hidden = oTable.fnGetHiddenTrNodes(); // get all hidden nodes

 var result = [], found;

 // remove hidden nodes from all nodes
 for (var i = 0; i < rows.length; i++) {
  found = false;
    for (var j = 0; j < rows_hidden.length; j++) {
      if (rows[i] == rows_hidden[j]) {
        found = true;
          break;
                }
            }
            if (!found) {
                result.Push(rows[i]); 
            }
    }
1
proggrock

La manière la plus simple de le faire est en réalité intégrée directement à l’API DataTables :

_('tr', {"filter": "applied"})

Utilisé dans une fonction:

function get_filtered_datatable() {
    var filteredrows = $("#mydatatable").dataTable()._('tr', {"filter": "applied"});

    for ( var i = 0; i < filteredrows.length; i++ ) {
        debug.console(filteredrows[i]);
    };
}
16
Joe Bergevin

Depuis Datatables 1.10, il existe un moyen intégré d’obtenir les lignes filtrées ou non filtrées après une recherche.

var table = $('#example').DataTable();
table.rows( {search:'applied'} ).nodes();
table.rows( {search:'removed'} ).nodes();

Il existe d'autres options pour obtenir uniquement la page actuelle ou toutes les pages, ainsi que la commande. Plus de détails ici: http://datatables.net/reference/type/selector-modifier

14
anagnostatos

Mieux vaut tard que jamais, mais je me débattais moi-même. Voici ce que je suis venu avec

$.fn.dataTableExt.oApi.fnGetVisibleData = function(){
    displayed = [];
    currentlyDisplayed = this.fnSettings().aiDisplay; //gets displayed rows by their int identifier
    for (index in currentlyDisplayed){
        displayed.Push( this.fnGetData( currentlyDisplayed[index] ));
    }
    return displayed;

}
2
nsheaps

Si vous essayez d'obtenir les éléments tr DOM réels à la place des données, la solution est similaire aux solutions de soulignement décrites ci-dessus, mais vous utilisez plutôt la méthode $.

function getFilteredDatatable() {
    return $("table.dataTable").dataTable().$('tr', { "filter": "applied" });
}

Plus d'informations sont disponibles sur la page de documentation de l'API. http://datatables.net/api

1
AlecBoutin

Avoir la configuration de la table cela fonctionnait pour moi ayant une case à cocher avec l'id pour chaque ligne et une autre case à cocher qui sélectionnera toutes les lignes soit lorsqu'une application filtrée a été appliquée (uniquement les lignes filtrées) ou non (toutes les lignes)

$(document).ready(function() {
    var myDataTableHandle = $('#example').dataTable({"bPaginate": false});

   $('#selectAllCheckBox').click(function() {
       if($(this).is(':checked')){ 
          var filteredRows  =   myDataTableHandle._('tr', {"filter":"applied"});
          alert( filteredRows.length +' nodes were returned' );     
          $(myDataTableHandle.fnGetNodes()).find($('input[name=idCheckBox]')).each(function () {
              $(this).prop('checked', true);
           });
        else{ 
          $('input[name=idCheckBox]:checked').prop('checked', false);
         } 
      });
});
0
user3730564

Vous pouvez obtenir la liste des lignes visibles en modifiant la fonction fnGetHiddenTrNodes comme suit.

 $.fn.dataTableExt.oApi.fnGetVisibleTrNodes = function (oSettings, arg1, arg2) {

            /* Note the use of a DataTables 'private' function thought the 'oApi' object */

            var anNodes = this.oApi._fnGetTrNodes(oSettings);
            var anDisplay = $('tbody tr', oSettings.nTable);
            var visibleNodes = [];

            for (var i = 0; i < anDisplay.length; i++) {
                var iIndex = jQuery.inArray(anDisplay[i], anNodes);

                if (iIndex != -1) {
                    visibleNodes.Push(anDisplay[i]);
                }
            }

            /* Fire back the array to the caller */
            return visibleNodes;
        }
0
Prasad Hewage