diff --git a/src/core/core.scale.js b/src/core/core.scale.js index cca092319be..c5c6a98a762 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -550,6 +550,14 @@ export default class Scale extends Element { tick = ticks[i]; tick.label = call(tickOpts.callback, [tick.value, i, ticks], me); } + // Ticks should be skipped when callback returns null or undef, so lets remove those. + for (i = 0; i < ilen; i++) { + if (isNullOrUndef(ticks[i].label)) { + ticks.splice(i, 1); + ilen--; + i--; + } + } } afterTickToLabelConversion() { call(this.options.afterTickToLabelConversion, [this]); diff --git a/test/fixtures/core.scale/ticks/skip-by-callback.js b/test/fixtures/core.scale/ticks/skip-by-callback.js new file mode 100644 index 00000000000..53232bffa44 --- /dev/null +++ b/test/fixtures/core.scale/ticks/skip-by-callback.js @@ -0,0 +1,44 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/8892', + config: { + type: 'line', + data: { + labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], + datasets: [ + { + data: [12, 19, 3, 5, 2, 3], + }, + { + data: [7, 11, 5, 8, 3, 7], + } + ] + }, + options: { + scales: { + x: { + ticks: { + callback: function(val, index) { + if (index === 1) { + return undefined; + } + if (index === 3) { + return null; + } + return this.getLabelForValue(val); + } + } + }, + y: { + ticks: { + callback: function(val, index) { + return index % 2 === 0 ? '' + val : null; + } + } + } + }, + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/core.scale/ticks/skip-by-callback.png b/test/fixtures/core.scale/ticks/skip-by-callback.png new file mode 100644 index 00000000000..d6608d1b04a Binary files /dev/null and b/test/fixtures/core.scale/ticks/skip-by-callback.png differ