How to reload datatable by using new url and some parameters without reinitialize it
In your DataTables ajax
section, instead of using the object form of the data
option, you can use the function form. This allows you to dynamically pass in your request data for each new ajax call.
So, instead of this:
"data" : myData
It would be this:
"data": function () {
return myData;
}
And, as you already note, you can use the ajax.url()
call to specify the new URL:
table.ajax.url( 'newData.json' ).load();
Warning: This assumes you are not using server-side processing, as this will overwrite the server-side request data which is auto-generated by DataTables. If you are using server-side processing, then you have to merge your custom data into the pre-existing request data.
The documentation shows an example for that, using jQuery extend
:
"data": function ( d ) {
return $.extend( {}, d, {
"extra_search": $('#extra').val()
} );
}
You don't need to use $.extend
. You just need to be careful that you do not overwrite the request data generated by Datatables.
Another way to handle this is to simply append data to the data structure represented by d
in "data": function ( d )
:
"data": function ( d ) {
d.extra_search = $('#extra').val();
}
Update with a more detailed example
Here is a full example, which you can copy into a html file and run for yourself, if you wish. It uses data from a dummy JSON provider, just for testing.
The HTML, showing the table and a button. The button is how I tested the ability to call a new URL and pass new request parameters to that new URL:
<div style="margin: 20px;">
<button id="button_one" type="button">Resubmit</button>
<br><br>
<table id="example" class="display" style="width:100%"></table>
</div>
Here is the related script containing the DataTable definition and a function which calls the new URL (with new request parameters):
<script>
$(document).ready(function() {
// ajax for initial table creation:
var requestUrl = "https://jsonplaceholder.typicode.com/posts";
var requestData = { "name": "Abel", "location": "here" };
var table = $('#example').DataTable( {
ajax: {
method: "GET",
url: requestUrl,
"data": function ( ) {
return requestData;
},
dataSrc: "",
},
"columns": [
{ "title": "User ID", "data": "userId" },
{ "title": "ID", "data": "id" },
{ "title": "Title", "data": "title" }
]
} );
$("#button_one").click(function() {
// subsequent ajax call, with button click:
requestUrl = "https://jsonplaceholder.typicode.com/todos";
requestData = { "name": "Charlie", "location": "there" };
table.ajax.url( requestUrl ).load();
});
} );
</script>
The key points in this example are:
There are 2 different URLs. The first one is used when DataTables is created. The second one is used when the button is clicked.
There are 2 different sets of request data, for the two URLs.
Using this approach, you can repeatedly call table.ajax.url( requestUrl ).load()
with different URLs and different sets of request data, without needing to destroy the DataTable.
Handling Form Data
Here is a simple HTML form:
<form id="filter-form">
City:<input type="text" id="city" name="city">
Country:<input type="text" id="country" name="country">
<input type="submit" value="Submit">
</form>
For testing, I have the following JavaScript which captures the contents of the form into an array:
var form_data = [];
$( "#filter-form" ).submit(function( event ) {
event.preventDefault();
form_data = $( this ).serializeArray();
table.ajax.url( url ).load();
});
The end result is data like this in the form_data
variable:
[
{
"name": "city",
"value": "Berlin"
},
{
"name": "country",
"value": "Germany"
}
]
Now I can merge that data into the automatically created server-side request data. This is where I can choose to use the $.extend()
function I mentioned above:
$('#example').DataTable( {
serverSide: true,
ajax: {
method: "POST",
url: url, // from a variable
data: function( d ) {
return $.extend( {}, d, { "my_extra_data": form_data } );
}
},
... //whatever else is in your DataTable definition...
});
This function results in request data like the following:
{
"draw": "2",
"columns[0][data]": "id",
"columns[0][name]": "",
...
"start": "0",
"length": "10",
"search[value]": "",
"search[regex]": "false",
"my_extra_data[0][name]": "city",
"my_extra_data[0][value]": "Berlin",
"my_extra_data[1][name]": "country",
"my_extra_data[1][value]": "Germany"
}
You can see your my_extra_data
values are included along with the server-side auto-generated request data. And all of this gets sent to the server as part of your request.
If you are using POST
then it's in the request body.
If you are using GET
, then it's the same data - but added to the URL as a query string.
In both cases, it's converted to the standard string representation used by form data.
It's then up to the server-side code to access this data in the usual way.
NOTE: You may have expected your URL-encoded form data to be provided as this:
...&city=Berlin&country=Germany
But instead it is provided as arrays of name/value pairs:
&my_extra_data%5B0%5D%5Bvalue%5D=Berlin&my_extra_data%5B1%5D%5Bname%5D=country&my_extra_data%5B1%5D%5Bvalue%5D=Germany
So, there is extra server-side work needed to parse this data.
If you want to convert your form data directly into a JavaScript object like this:
{ "city": "Berlin", "country", "Germany" }
then take a look at the answers to this question:
Convert form data to JavaScript object with jQuery
Refresh jQuery datatable table
Try this
Initially you initialized the table so first clear that table
$('#myTable').dataTable().fnDestroy();
Then initialize again after ajax success
$('#myTable').dataTable();
Like this
$("#dropdownlist").on("change", function () {
$("tbody").empty();
$.ajax({
type: "POST",
url: "@Url.Action("ActionHere", "Controller")",
dataType: "json",
success: function (data) {
$.each(data, function (key, item) {
$("tbody").append("<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr>");
});
}
})
$('#myTable').dataTable().fnDestroy();
$('#myTable').dataTable({ // Cannot initialize it again error
"aoColumns": [
{ "bSortable": false },
null, null, null, null
]
});
});
DEMO
JQuery datatable ajax.reload()
Try calling with the selector
$('#tblData').DataTable().ajax.reload()
If you're using an older version, probably this one works
$('#tblData').dataTable().api().ajax.reload();
Related Topics
How to Clear All Input Fields in Bootstrap Modal When Clicking Data-Dismiss Button
Get Docx File Contents Using Javascript/Jquery
How to Get 30 Days Prior to Current Date
Possible to Detect If a User Has Multiple Tabs of Your Site Open
How to Delete Specific Item from Localstorage
How to Redirect to Another Page in Reactjs When a If Condition Is Executed
React State Change Not Causing Re-Render
Different Color for Each Bar in a Bar Chart; Chartjs
How to Iterate Using Ngfor Loop Map Containing Key as String and Values as Map Iteration
Create React App Breaks After Deployment on Refresh 404 With Nginx
Use Localstorage Variables in PHP
Move an Image With JavaScript Using Mouse Events
Angular 4 | Window.Scrollto(); Is Not Working Properly
How to Use Owl Carousel Vertically