Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Want to see what's currently in public preview? We've pulled it all together in one place. Check it out here
cancel
Showing results for 
Search instead for 
Did you mean: 
_jespers_
Partner - Creator II
Partner - Creator II

Qlik Sense Extension issue: TypeError: $(…).DataTable is not a function

I have created an extension that needs to use the Datatables plugin (https://datatables.net/extensions/buttons/#Download). But when trying to initialize the plugin, according to the help:

var table = $('#mytable').DataTable();

I get an error message stating "TypeError: $(...).DataTable is not a function".


I know that jquery has been loaded, since I use it a lot in the extension without any issues.

A minimal version of the Qlik Sense Extension javascript file:

define( [
"qlik",
"jquery",
"text!./template.html",
"./datatables.min",
],
function ( qlik, $, template, datatables ) {

    return {
        template: template,
        support: {
            snapshot: true,
            export: true,
            exportData: false
        },
        paint: function () {
            var table = $('#mytable').DataTable();

            return qlik.Promise.resolve();
        },
        controller: ['$scope', function ( $scope ) {
        }]
    };

} );

My guess is that i need to call the DataTable() in another way since datatables.min consists of anonymous functions and since Qlik Sense uses require.js to import external files.

1 Solution

Accepted Solutions
m_s
Partner - Creator II
Partner - Creator II

The Buttons-Plugin requires "datatables.net" which means that you need to create a path for it:

This should work:

require.config( {

paths: {

"datatables.net": "https://cdn.datatables.net/1.10.16/js/jquery.dataTables"

}

});

define([

"qlik",

"jquery",

"text!./template.html",

"https://cdn.datatables.net/buttons/1.4.2/js/dataTables.buttons.js"

],

Mathias

View solution in original post

4 Replies
m_s
Partner - Creator II
Partner - Creator II

Hello Jesper,

Yes its probably an issue if there are multiple plugins selected. Just referencing the datatables library without any plugin works fine.

define( [

"qlik",

"jquery",

"text!./template.html",

"https://cdn.datatables.net/v/dt/dt-1.10.16/datatables.min.js"

],

function ( qlik, $, template, datatables ) {

return {

template: template,

support: {

snapshot: true,

export: true,

exportData: false

},

paint: function () {

$(document).ready(function() {

var table = $('#mytable').DataTable();

} );

return qlik.Promise.resolve();

},

controller: ['$scope', function ( $scope ) {

}]

};

} );

Maybe you can load the plugins one by one?

Mathias

PS. You need a <tbody> and <thead> element for DataTables to work so I modified your template.html:

<div qv-extension style="height: 100%; position: relative; overflow: auto;" class="ng-scope">

<table id="mytable">

<thead>

<tr>

<td>Cell 1</td>

<td>Cell 2</td>

</tr>

</thead>

<tbody>

<tr>

<td>Cell 1</td>

<td>Cell 2</td>

</tr>

</tbody>

</table>

</div>

_jespers_
Partner - Creator II
Partner - Creator II
Author

Hello Mathias,

I have tried your way of importing and as you said it works fine when I'm only importing the core datatables.min.js.

But in my extension I also need to import the Buttons plugin to be able to export to excel. So I then added that plugin to the define section.

define( [

"qlik",

"jquery",

"text!./template.html",

"https://cdn.datatables.net/1.10.16/js/jquery.dataTables.js",

"https://cdn.datatables.net/buttons/1.4.2/js/dataTables.buttons.js"

],

function ( qlik, $, template, datatables, datatables_button ) {

return {

template: template,

support: {

snapshot: true,

export: true,

exportData: false

},

paint: function () {

$(document).ready(function() {

var table = $('#mytable').DataTable();

} );

return qlik.Promise.resolve();

},

controller: ['$scope', function ( $scope ) {

}]

};

} );

But now when I try to execute the script I get a new error:

error.PNG

This has something to do with the code inside the Button script, because as soon as I remove it, the error is gone. The first part refers to the local server.

It seems like there is a part in the Button script where this error happens:

if ( typeof define === 'function' && define.amd ) {

// AMD

// The script executes fine here

define( ['jquery', 'datatables.net'], function ( $ ) {

// But the script never enter this part.

return factory( $, window, document );

} );

}

Any idea why this happens?

m_s
Partner - Creator II
Partner - Creator II

The Buttons-Plugin requires "datatables.net" which means that you need to create a path for it:

This should work:

require.config( {

paths: {

"datatables.net": "https://cdn.datatables.net/1.10.16/js/jquery.dataTables"

}

});

define([

"qlik",

"jquery",

"text!./template.html",

"https://cdn.datatables.net/buttons/1.4.2/js/dataTables.buttons.js"

],

Mathias

_jespers_
Partner - Creator II
Partner - Creator II
Author

Finally! Now it works.

Thank you!