Junior
Junior

Reputation: 11990

How can I change the data of DataTables after it has been initialized?

I want to populate a datatables based on an ajax request.

Here is what I have done

   $(function(e) {

        $('#CampaignMenu').change(function(e) {

            $('#ReportWrapper').hide();


            if (  $(this).val() != '0') {
                $('#DisplayReport').attr('disabled', false);
            } else {
                $('#DisplayReport').attr('disabled', true);
            }

        });

        $('#DisplayReport').click(function (e) {

            $.ajax({
                type: 'GET',
                url: '/getdata',
                data: { 'campaign_id': $('#CampaignMenu').val() },
                dataType: 'json',
                success: function (json) {

                    $('#reportTable').DataTable({
                        data: json,
                        pageLength: 50,
                        lengthMenu: [10, 25, 50, 75, 100, 250, 500, 1000],
                        searching: false,
                        order: [   [ 2, 'desc' ]  ],
                        columns: [
                            { data: 'chain_name', title: 'Chain Name' },
                            { data: 'store_id' , title: 'Store Number' },
                            { data: 'completed', title: 'Total Surveys Completed' },
                            { data: 'initial_quota', title: 'Target Surveys To Complete' },
                            { data: 'total_callable', title: 'Total Call In The Dialer Queue' },
                            { data: 'current_status', title: 'Current Quota Status' },
                        ]
                    });

                    $('#ReportWrapper').show();

                }
            });

        });

    });

</script>

The first request works with no problem. However, when I call the ajax request the second time, I get this error

DataTables warning: table id=reportTable - Cannot reinitialise DataTable. For more information about this error, please see http://datatables.net/tn/3

How can I change the table content after it has been initialized?

I thought of initializing the datatable on the page loads, then call some event to populate it later with in my Ajax request. But, I need an event to call from my ajax request.

    $(window).load(function (e) {

        $('#reportTable').DataTable({
            pageLength: 50,
            lengthMenu: [10, 25, 50, 75, 100, 250, 500, 1000],
            searching: false,
            order: [   [ 2, 'desc' ]  ],
            columns: [
                { data: 'chain_name', title: 'Chain Name' },
                { data: 'store_id' , title: 'Store Number' },
                { data: 'completed', title: 'Total Surveys Completed' },
                { data: 'initial_quota', title: 'Target Surveys To Complete' },
                { data: 'total_callable', title: 'Total Call In The Dialer Queue' },
                { data: 'current_status', title: 'Current Quota Status' }
             ]
        });
    });

I tried to destroy the table before I reinitialize it, but that is not working.

$('#reportTable').DataTable().destroy();

UPDATED

I found a way to add data to the table after I initialized it. But I need a way to clear the data first so I won't have duplicates data.

Here is what I have done to add data

           var table = $('#reportTable').dataTable();

                table.fnAddData(json);

Te previous code keeps appending data to the table, but it does not clear existing data first causing duplicates. I tried to add before I add the following code [table.clear().draw()][2] but that gives me an error

TypeError: table.clear is not a function

How can I correctly get the DataTable to change it's content over and over on the fly?

Upvotes: 7

Views: 12724

Answers (2)

Simon Lam
Simon Lam

Reputation: 41

DataTables has provided an option by using destroy:true, which will destroy the previous data and re-initialize it! I am working with WordPress as well and it works perfectly. If anyone faces such problem, you can simply try this solution. Hope this helps, cheers!

$('#DisplayReport').click(function (e) {

            $.ajax({
                type: 'GET',
                url: '/getdata',
                data: { 'campaign_id': $('#CampaignMenu').val() },
                dataType: 'json',
                success: function (json) {

                    $('#reportTable').DataTable({
                        destroy: true,   <======= Add this to remove previous table
                        data: json,
                        pageLength: 50,
                        lengthMenu: [10, 25, 50, 75, 100, 250, 500, 1000],
                        searching: false,
                        order: [   [ 2, 'desc' ]  ],
                        columns: [
                            { data: 'chain_name', title: 'Chain Name' },
                            { data: 'store_id' , title: 'Store Number' },
                            { data: 'completed', title: 'Total Surveys Completed' },
                            { data: 'initial_quota', title: 'Target Surveys To Complete' },
                            { data: 'total_callable', title: 'Total Call In The Dialer Queue' },
                            { data: 'current_status', title: 'Current Quota Status' },
                        ]
                    });
                    $('#ReportWrapper').show();
                }
            });
        });
    });

Upvotes: 4

chris van hooser
chris van hooser

Reputation: 388

To use table.clear(), use DataTable() instead of dataTable()

dataTable returns a jquery object, where as DataTable returns the datatables object

I've also ran into this issue, and they way i have handled it was just to destroy everything and recreate it, but performance wasn't super critical for this task.

Upvotes: 3

Related Questions