J'ai un violon qui fait un ajax à URL et rend un tableau, mais je veux différer et charger seulement 10 lignes pendant chargement de la page.
<table id="example" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th>Account ID</th>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
</table>
$(document).ready(function() {
$('#example').DataTable( {
"bPaginate": true,
"processing": true,
"bServerSide": true,
ajax: {
url: 'https://api.myjson.com/bins/1egsx',
dataSrc: 'data'
},
columns: [
{ data: 'account_id' },
{ data: 'name' },
{ data: 'email' }
],
"deferRender": true,
"deferLoading": 10,
} );
});
Je n'arrêtais pas de
Aucun enregistrements correspondants trouvés
TL; DR: Vous devriez probablement utiliser soit deferRender
avec le traitement côté client [~ # ~] ou [ ~ # ~] traitement côté serveur sans deferRender
(en corrigeant vos données JSON). Cette réponse suppose que vous souhaitez un traitement côté serveur.
deferLoading
Lorsque vous utilisez correctement le traitement côté serveur, le comportement par défaut consiste à envoyer uniquement le nombre de lignes sur une page par demande ajax. Vous ne devriez pas avoir besoin d'utiliser deferLoading - voici ce que cela fait (de documentation ici ):
Lorsque vous utilisez le traitement côté serveur, le mode de fonctionnement par défaut de DataTables consiste à simplement jeter toutes les données qui existent actuellement dans la table et à demander au serveur d'obtenir la première page de données à afficher. C'est très bien pour un tableau vide, mais si vous avez déjà la première page de données affichée en HTML brut, c'est un gaspillage de ressources. En tant que telle, cette option existe pour vous permettre de demander à DataTables de ne pas faire cette demande initiale, mais plutôt d'utiliser les données déjà sur la page (aucun tri, etc. ne lui sera appliqué).
Étant donné que toutes vos données proviennent d'ajax, cette option ne doit pas être sélectionnée.
deferRender
Vous ne devriez vraiment pas non plus avoir besoin d'utiliser deferRender
si vous utilisez correctement le traitement côté serveur. deferRender
(à partir de son documentation ici ):
À titre d'exemple pour illustrer cela, si vous chargez un ensemble de données avec 10000 lignes, mais une longueur d'affichage de pagination de seulement 10 enregistrements, plutôt que de créer les 10000 lignes, lorsque le rendu différé est activé, DataTables n'en créera que 10.
Notez la phrase importante ici:
si vous chargez un ensemble de données avec 10 000 lignes
Si vous utilisez correctement le traitement côté serveur, vous ne devez charger le nombre de lignes par page qu'en un seul chargement. deferRender
est vraiment une option pour accélérer les tables de données lors de l'utilisation du traitement côté client. Le traitement côté serveur gère déjà ce que fait deferRender
. Voir cette image dans les DataTables FAQ pour savoir comment accélérer les tables de données:
Notez qu'il met l'accent sur deferRender
pour le côté client uniquement. Une remarque à faire ici est que si vous n'avez pas beaucoup de lignes (des dizaines de milliers +), vous n'avez probablement pas besoin d'utiliser le traitement côté serveur.
Votre problème vient probablement du fait que votre API ne renvoie pas la forme appropriée de JSON pour le traitement côté serveur; vous devez envoyer plus d'informations que les seules données à afficher. Voici la page de documentation avec la description complète (vous devriez certainement la lire), mais je vais essayer de décrire les bases ci-dessous.
Demande
La demande envoyée à votre API va contenir des données que vous devez traiter.
draw
est un identifiant unique qui suit les ensembles de paires requête-réponse; la valeur de la réponse doit correspondre à la valeur de la demande. C'est ainsi que les tables de données font correspondre les demandes aux réponses.
start
représente l'enregistrement qui devrait être le premier dans la réponse; si nous affichons 10 enregistrements par page et que nous sommes à la page 2, start
sera égal à 10, de sorte que dans la réponse, nous n'enverrons que des enregistrements numérotés 10-19.
length
représente le nombre attendu de lignes pour ce tirage, donc dans l'exemple ci-dessus de 10 enregistrements par page à la page 2, length
sera égal à 10. Voici le nombre d'enregistrements que vous devez renvoyer . Cette valeur sera basée sur les options lengthMenu
ou pageLength
pour l'initialisation des tables de données. (Documenté ici et ici , respectivement)
Une chose importante à retenir qui est souvent oubliée est d'envoyer SEULEMENT autant de lignes que length
; n'envoyez pas toutes vos lignes dans la première demande.
Réponse
Votre réponse devra également être modifiée. Fondamentalement, au lieu de simplement retourner data
, vous devez renvoyer un objet qui ressemble à l'exemple ci-dessous (à partir de cela page de documentation ):
{
"draw": 1,
"recordsTotal": 57,
"recordsFiltered": 57,
"data": [
[
"Angelica",
"Ramos",
"System Architect",
"London",
"9th Oct 09",
"$2,875"
],
[
"Ashton",
"Cox",
"Technical Author",
"San Francisco",
"12th Jan 09",
"$4,800"
],
...
]
}
Notez les données supplémentaires: draw
, recordsTotal
et recordsFiltered
en plus de l'habituel data
. Ce sont des options obligatoires lors de l'utilisation du traitement côté serveur.
draw
représente le nombre correspondant à la demande faite à votre API; la demande GET aura également une valeur draw
, et la valeur dans le GET doit correspondre à la valeur dans la réponse.
recordsTotal
représente le nombre total d'enregistrements dans le tableau, sur toutes les pages, où recordsFiltered
représente le nombre d'enregistrements qui répondent aux exigences de filtrage définies par la demande GET (s'il n'y a pas de filtrage, il doit être égal à recordsTotal
.
Ce sont les éléments minimum requis pour votre réponse, mais vous devriez consulter la documentation liée pour plus d'informations sur les valeurs facultatives.
Note latérale
En remarque; bServerSide
doit être serverSide
et bPaginate
doit être paging
si vous utilisez DataTables version 1.10 ou ultérieure.
Vous pouvez également le faire avec iDisplayLength
:
$('#example').DataTable( {
"aLengthMenu": [[5, 10, 15, -1], [5, 10, 15, "All"]],
"iDisplayLength": 10,
"bPaginate": true,
"processing": true,
"bServerSide": true,
ajax: {
url: 'https://api.myjson.com/bins/1egsx',
dataSrc: 'data'
},
columns: [
{ data: 'account_id' },
{ data: 'name' },
{ data: 'email' }
],
} );
Je suppose que votre intention ici est d'afficher le DataTable dès que la page se charge. Voici deux façons de charger des données partielles en fonction de vos besoins. Les données entières peuvent être chargées à un moment ultérieur en déclenchant un événement comme un clic sur un bouton. Dans les deux cas, la totalité des données sera également téléchargée et stockée localement qui pourra ensuite être chargée en fonction de l'événement déclenché afin d'éviter de faire un autre appel pour récupérer la totalité des données.
Cas 1: Vous souhaitez uniquement télécharger des données partielles à partir de la source
Toutes les données seront extraites de ' https://api.myjson.com/bins/1egsx ' avant que le DataTable ne traite les données. Si vous ne souhaitez extraire que des données partielles de l'URL, vous pouvez créer votre fonction personnalisée qui analysera les données en AJAX mode interactif (readyState = 3), arrêtez-vous après avoir reçu les 10 premières entrées et puis massez les données et passez-les comme données d'entrée pour le DataTable. Voici un résumé de ce que vous devez faire
var inputData = '';
function loadDataTablePreview() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 3 && this.status == 200) {
inputData += this.responseText;
// Count the number of closing '}'. If its 10, lets start processing our data
// Get the index of 10 closing '}'
// Create a substring of inputData
// append ']}'
// Now JSON Decode
var decodedData = JSON.parse(inputData);
// Now create an instance of the DataTable passing this data as the input data
$('#example').DataTable( {
"bPaginate": true,
"processing": true,
"bServerSide": true,
data: decodedData,
columns: [
{ data: 'account_id' },
{ data: 'name' },
{ data: 'email' }
],
});
}
else if (this.readyState == 4 && this.status == 200) {
// JSON Decode the data and store it to load later
}
};
xhttp.open("GET", "https://api.myjson.com/bins/1egsx", true);
xhttp.send();
}
$(document).ready(function() {
loadDataTablePreview();
}
Cas 2: ne chargez les 10 premières entrées qu'après avoir téléchargé des données entières
En supposant que vous êtes prêt à télécharger l'intégralité des données, avant d'afficher le DataTable, vous pouvez créer une fonction pour votre dataSrc comme indiqué ci-dessous. Cela n'affichera que les 10 entrées du tableau. Vous pouvez éventuellement stocker l'intégralité du JSON dans cette fonction dans le magasin de données du navigateur (comme sessionStorage), puis déclencher une fonction JS pour charger l'intégralité du JSON ultérieurement.
$(document).ready(function() {
$('#example').DataTable( {
"bPaginate": true,
"processing": true,
"bServerSide": true,
ajax: {
url: 'https://api.myjson.com/bins/1egsx',
dataSrc: function ( json ) {
// Store entire data in sessionStorage
// return the first 10 entries only for now
return json.data.slice(0,10);
},
},
columns: [
{ data: 'account_id' },
{ data: 'name' },
{ data: 'email' }
],
});
});