diff --git a/src/controllers/controller.line.js b/src/controllers/controller.line.js index 53083db0e..b7202dca7 100644 --- a/src/controllers/controller.line.js +++ b/src/controllers/controller.line.js @@ -103,6 +103,11 @@ export default class LineController extends DatasetController { const lastPoint = data[data.length - 1].size(); return Math.max(border, firstPoint, lastPoint) / 2; } + + draw() { + this._cachedMeta.dataset.updateControlPoints(this.chart.chartArea); + super.draw(); + } } LineController.id = 'line'; diff --git a/src/elements/element.line.js b/src/elements/element.line.js index 55f3718e9..d01278d3e 100644 --- a/src/elements/element.line.js +++ b/src/elements/element.line.js @@ -194,6 +194,7 @@ export default class Line extends Element { this._fullLoop = undefined; this._points = undefined; this._segments = undefined; + this._pointsUpdated = false; if (cfg) { Object.assign(this, cfg); @@ -203,9 +204,10 @@ export default class Line extends Element { updateControlPoints(chartArea) { const me = this; const options = me.options; - if (options.tension && !options.stepped) { + if (options.tension && !options.stepped && !me._pointsUpdated) { const loop = options.spanGaps ? me._loop : me._fullLoop; _updateBezierControlPoints(me._points, options, chartArea, loop); + me._pointsUpdated = true; } } @@ -338,6 +340,8 @@ export default class Line extends Element { ctx.stroke(); ctx.restore(); + + this._pointsUpdated = false; } } diff --git a/test/specs/controller.line.tests.js b/test/specs/controller.line.tests.js index e66ed7101..b709d6d45 100644 --- a/test/specs/controller.line.tests.js +++ b/test/specs/controller.line.tests.js @@ -79,6 +79,7 @@ describe('Chart.controllers.line', function() { }); var meta = chart.getDatasetMeta(0); + spyOn(meta.dataset, 'updateControlPoints'); spyOn(meta.dataset, 'draw'); spyOn(meta.data[0], 'draw'); spyOn(meta.data[1], 'draw'); @@ -87,6 +88,8 @@ describe('Chart.controllers.line', function() { chart.update(); + expect(meta.dataset.updateControlPoints.calls.count()).toBeGreaterThanOrEqual(1); + expect(meta.dataset.draw.calls.count()).toBe(1); expect(meta.data[0].draw.calls.count()).toBe(1); expect(meta.data[1].draw.calls.count()).toBe(1); expect(meta.data[2].draw.calls.count()).toBe(1);