|
30 | 30 | state = (state.length > 1 ? deparam(state.substr(1)) : {}); |
31 | 31 | var persistOptions = config.state === 'none' ? {} : { |
32 | 32 | stateSave: true, |
33 | | - stateLoadCallback: function(settings) { |
34 | | - var copy = JSON.parse(JSON.stringify(state)); |
35 | | - copy.time = Date.now(); |
36 | | - return copy; |
| 33 | + stateLoadCallback: function(s, cb) { |
| 34 | + // Only need stateSave to expose state() function as loading lazily is not possible otherwise |
| 35 | + return null; |
37 | 36 | } |
38 | 37 | }; |
39 | 38 |
|
|
46 | 45 | _init: true |
47 | 46 | } |
48 | 47 | }).done(function(data) { |
49 | | - var rebuild = (Object.keys(state).length === 0), cached, baseState; |
| 48 | + var baseState; |
50 | 49 |
|
| 50 | + // Merge all options from different sources together and add the Ajax loader |
51 | 51 | var dtOpts = $.extend({}, data.options, config.options, options, persistOptions, { |
52 | 52 | ajax: function (request, drawCallback, settings) { |
53 | | - if (rebuild) { |
| 53 | + if (data) { |
54 | 54 | data.draw = request.draw; |
55 | 55 | drawCallback(data); |
56 | | - rebuild = false; |
| 56 | + data = null; |
| 57 | + if (Object.keys(state).length) { |
| 58 | + var merged = $.extend(true, {}, dt.state(), state); |
| 59 | + dt |
| 60 | + .order(merged.order) |
| 61 | + .search(merged.search.search) |
| 62 | + .page.len(merged.length) |
| 63 | + .page(merged.start / merged.length) |
| 64 | + .draw(false); |
| 65 | + } |
57 | 66 | } else { |
58 | 67 | request._dt = config.name; |
59 | 68 | $.ajax(config.url, { |
|
69 | 78 | root.html(data.template); |
70 | 79 | dt = $('table', root).DataTable(dtOpts); |
71 | 80 | if (config.state !== 'none') { |
72 | | - dt.on('stateSaveParams.dt', (e, settings, data) => { |
73 | | - //$.extend(data, $('form[name={{ filterForm.vars.name }}]').serializeObject()); |
74 | | - data = $.param(data).split('&'); |
75 | | - baseState = baseState || data; |
76 | | - var diff = data.filter(el => { return baseState.indexOf(el) === -1 && el.indexOf('time=') !== 0; }); |
77 | | - switch (config.state) { |
78 | | - case 'fragment': |
79 | | - history.replaceState(null, null, '#' + decodeURIComponent(diff.join('&'))); |
80 | | - break; |
81 | | - case 'query': |
82 | | - history.replaceState(null, null, '#' + decodeURIComponent(diff.join('&'))); |
83 | | - break; |
| 81 | + dt.on('draw.dt', function(e) { |
| 82 | + var data = $.param(dt.state()).split('&'); |
| 83 | + |
| 84 | + // First draw establishes state, subsequent draws run diff on the first |
| 85 | + if (!baseState) { |
| 86 | + baseState = data; |
| 87 | + } else { |
| 88 | + var diff = data.filter(el => { return baseState.indexOf(el) === -1 && el.indexOf('time=') !== 0; }); |
| 89 | + switch (config.state) { |
| 90 | + case 'fragment': |
| 91 | + history.replaceState(null, null, '#' + decodeURIComponent(diff.join('&'))); |
| 92 | + break; |
| 93 | + case 'query': |
| 94 | + history.replaceState(null, null, '?' + decodeURIComponent(diff.join('&'))); |
| 95 | + break; |
| 96 | + } |
84 | 97 | } |
85 | | - }); |
| 98 | + }) |
86 | 99 | } |
87 | 100 |
|
88 | 101 | fulfill(dt); |
|
0 commit comments