2015-08-14 3 views
0

Я пытался удалить и перерисовать холст, но я не могу сделать его отзывчивым.chartjs удаление/перерисовка холст, график не реагирует

var testChart = document.getElementById('testLine').getContext('2d'); 
var myLineChart = new Chart(testChart).Line(lineData); 
$("#testLine").remove(); 
$("#graph-container").html("<canvas id='testLine'></canvas>"); 
var testChart1 = document.getElementById('testLine').getContext('2d'); 
var myLineChart1 = new Chart(testChart1).Line(lineData); 

как отзывчивый и mantainaskectratio устанавливаются истинной

responsive: true, 
maintainAspectRatio: true 

это упрощенная версия моего кода, но я не могу заставить его работать. важно отметить, что методы .destroy() или .clear() не соответствуют моим потребностям!

здесь живой пример и весь код теста https://jsfiddle.net/ob0w8thn/11/

+0

При изменении размера окна и перезагрузите страницу график растягивает, чтобы заполнить всю ширину содержимого. Как вы чувствуете, что он работает не так, как ожидалось? Ура! – potatopeelings

+0

он должен реагировать при изменении размера окна по умолчанию, я не хочу перезагружать страницу :) – user1751287

+0

, если я не удаляю и перерисовываю холст, он работает безупречно! – user1751287

ответ

1

, важно отметить, что .destroy() или .clear() методы DonT подходят мои потребности!

Я думаю, что здесь что-то не так происходит. Основная проблема здесь заключается в том, что вы не уничтожаете созданную вами диаграмму, то есть testChart. Простое удаление узла не полностью очищает его.


Chart.js внутренне хранит все экземпляры созданных диаграмм. Когда вы изменяете размер окна, Chart.js проходит через этот список, на котором выполняется изменение размера для каждого экземпляра. В вашем коде выше, это ошибка, потому что первый экземпляр больше не находится в DOM, и изменение размера никогда не срабатывает для второго экземпляра. testChart2

Я бы настоятельно предложил вам оценить, почему вы не можете сделать .destroy() (это просто удаляет экземпляр из внутреннего списка Chart.js) перед выполнением .remove().

Однако, если есть какая-то причина вы не можете назвать .destroy(), вы можете сделать одно из ниже


Варианта 1

Написать свое собственное окно изменения размера обработчика, который вызывает изменение размеров за исключением случаев, диаграммы, которые вы хотите, как так

Chart.helpers.addEvent(window, "resize", (function() { 
    var timeout; 
    return function() { 
     clearTimeout(timeout); 
     timeout = setTimeout(function() { 
      myLineChart1.resize(myLineChart1.render, true); 
     }, 50); 
    }; 
})()); 

Вариант 2

Перепишите getMaximumWidth функцию в библиотеке Chart.js добавить попробовать поймать блок, например, так (просто поиск по первой линии, чтобы найти блок)

getMaximumWidth = helpers.getMaximumWidth = function (domNode) { 
    try { 
     var container = domNode.parentNode; 
     // TODO = check cross browser stuff with this. 
     return container.clientWidth; 
    } 
    catch (err) 
    {} 
}, 

Вариант 3

Снимите реагирующий вариант для диаграммы перед удалением его узел, например, так

myLineChart.options.responsive = false; 
$("#testLine").remove(); 

Хотя это не удаляет ненужную ссылку из внутреннего списка Chart.js, это предотвращает запуск Chart.js (ненужной) ошибки, вызывающей изменение размера для экземпляра, который не существует в DOM.


Вот Вариант 3 в действии

Fiddle - https://jsfiddle.net/0vfqw61q/

+0

Я просто не знаю, почему это не работает с .destroy(), это заставляет меня гать :(да, ваш вариант 3 работает на этом простом примере, но это не с моим кодом, и я понятия не имею, почему! Это сказало, что я хочу()()()()()()()() transitionend ... ' – user1751287

+0

hm .. попробуйте вариант 2, затем - найдите 1-ю строку в файле Chart.js и скопируйте то, что отсутствует. – potatopeelings

+0

не могу разобраться, все, что я попробую, просто не работает :( – user1751287

Смежные вопросы