Граф графика искажается / частично смещается

Я регулярно обновляю несколько графиков Dygraphs. Через некоторое время, обычно через несколько минут, некоторые или все из них будут повреждены, как показано на рисунке ниже. Я не смог связать это конкретное событие или браузер. Это происходит даже с простым графиком, где я просто перезагружаю данные, хранящиеся в CSV-файле. Я звоню updateOptions({ file: URL }) на графе объекта, где URL указывает на файл CSV, а затем вызывает resetZoom() на графике объекта для обновления осей. Поиск в Google не выявил никого, страдающего подобным поведением, так что я потерял понимание того, что вызывает это.

Поврежденный граф Dygraphs - Линии сетки сжаты по части графика, и справа есть разрыв

Обновление 1: это связано с минимизацией и максимизацией браузера.

Обновление 2: проблема не возникает в Firefox. Это происходит в Google Chrome и Internet Explorer, хотя через некоторое время в IE возникает дополнительная проблема зависания (проблема еще на один день).

Обновление 3: минимум рабочих примеров добавлено по адресу http://jsfiddle.net/williamshipman/tvxekq56/ и http://jsfiddle.net/williamshipman/af66qstt/. Повторно минимизируйте и максимизируйте окно браузера, через некоторое время происходит искажение. В первом примере используется AngularJS (как и моя собственная работа), а во втором демонстрируется та же ошибка в чистом JavaScript. Возможно, вам придется свести к минимуму и увеличить до десятка раз, чтобы увидеть ошибку, это кажется довольно случайным.

2 ответа

Корень проблемы

Контекст холста не полностью восстановлен после завершения рисования.

Решение 1. (обходное решение)

Инъекционное canvas_ctx_.restore() после розыгрыша и context.save() до. save() необходим, потому что библиотека восстанавливает контекст перед каждым рисованием (кроме начального).

let g = new Dygraph('graph', {
  underlayCallback: (context) => {
    context.save();
  },
  drawCallback: (dygraph) => {
    dygraph.canvas_ctx_.restore();
  },
});

Решение 2. (исправление библиотеки)

Вот мой коммит, который вы можете применить к библиотекам src/dygraph.js https://github.com/pawelzwronek/dygraphs/commit/c66ca37b82f14e096652a338cae8abf568b9c764

Для меня похожая проблема возникает, когда я показываю и скрываю ось Y2. Эта строка помогла мне: ctx.clearRect(0, 0, this.width, this.height);

Файл: dygraph-canvas.js

var DygraphCanvasRenderer = function(dygraph, element, elementContext, layout) {
  ...
  ctx = this.dygraph_.hidden_ctx_;
  ctx.clearRect(0, 0, this.width, this.height); // <== clear whole canvas before cliping
  ctx.beginPath();
  ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h);
  ctx.clip();
};
Другие вопросы по тегам