Comment faire pour effacer un graphique à partir d'une toile de sorte que planent les événements ne peuvent pas être déclenchée?
Je suis en utilisant Chartjs pour afficher un Graphique en Ligne et cela fonctionne très bien:
//get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
//draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Mais le problème survient lorsque j'essaie de modifier les données du Graphique. - Je mettre à jour le graphique par la création d'une nouvelle instance d'un Graphique avec les nouveaux points de données, et donc à la réinitialisation de la toile.
Cela fonctionne bien. Cependant, quand j'ai passez la souris sur la nouvelle carte, si j'arrive à aller sur des emplacements spécifiques correspondant à des points affichés sur l'ancien tableau, le hover/étiquette est toujours déclenchée et, soudain, le vieil graphique est visible. Il reste visible pendant que ma souris est à cet emplacement et disparaît lorsque déplacer ce point. Je ne veux pas que l'ancien tableau d'affichage. Je veux l'enlever complètement.
J'ai essayé d'effacer à la fois la toile et le graphique existant avant le chargement de la nouvelle. Comme:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
et
chart.clear();
Mais aucun d'entre eux ont travaillé jusqu'à présent. Des idées sur comment je peux empêcher cela?
- Mec, c'est exactement le problème que je vais avoir. "Destroy()" méthode ne fonctionne pas et c'est de pisser me off.
- Pourrais-je vous demander comment vous allez accéder à l'objet graphique? Je vais avoir le même problème, j'ai créer un graphique, puis sur la manipulation d'un clic sur un bouton j'ai besoin de le détruire, mais il est dans une tout autre fonction et je ne peux pas trouver un moyen d'accéder à l'objet graphique à travers la toile ou le contexte des objets.
- Il y a un bug ouvert pour cette question, voir ici. github.com/jtblin/angular-chart.js/issues/187
- Eu ce problème. Solution pour créer/recréer stackoverflow.com/a/51882403/1181367
Vous devez vous connecter pour publier un commentaire.
J'ai eu d'énormes problèmes avec cette
J'ai d'abord essayé
.clear()
ensuite, j'ai essayé.destroy()
et j'ai essayé de configurer mon tableau de référence à la valeur nullCe qui a finalement résolu le problème pour moi: la suppression de la
<canvas>
élément et ensuite reappending une nouvelle<canvas>
au conteneur parentMon code spécifique (évidemment il y a un million de façons de le faire):
Que j'ai rencontré le même problème il ya quelques heures.
L' ".clear()" méthode réellement efface la toile, mais (évidemment), il part de l'objet vivant et réactif.
Lire attentivement la documentation officielle, dans la partie "utilisation Avancée" de la section, j'ai remarqué que la méthode ".destroy()", décrit comme suit:
Qu'il fait réellement ce qu'il prétend et il a travaillé très bien pour moi, je vous suggère de faire un essai.
C'est la seule chose qui a fonctionné pour moi:
J'ai eu le même problème ici... j'ai essayé d'utiliser destroy() et la méthode clear (), mais sans succès.
J'ai résolu de la manière suivante:
HTML:
Javascript:
Il fonctionne parfaitement pour moi... j'espère que Cela aide.
Cela a fonctionné très bien pour moi
Utilisation .détruire cela pour détruire tout graphique instances créées. Cela permettra de nettoyer toutes les références stockées à l'objet graphique à l'intérieur de Chart.js, tout comme les écouteurs d'événement attaché par Chart.js. Ce doit être appelée avant que la toile est réutilisé pour un nouveau graphique.
Nous pouvons mettre à jour le tableau de données dans Chart.js V2.0 comme suit:
À l'aide de CanvasJS, cela fonctionne pour moi compensation graphique et tout le reste, peut travailler pour vous aussi, de vous accorder l'ensemble de votre toile/tableau entièrement avant chaque traitement ailleurs:
Je ne pouvais pas obtenir .destroy() pour travailler donc c'est ce que je fais. Le chart_parent div est là où j'ai envie de la toile vers le haut. J'ai besoin de la toile pour redimensionner à chaque fois, donc cette réponse est une extension de l'-dessus.
HTML:
<div class="main_section" >
<div id="chart_parent"></div>
<div id="legend"></div>
</div>
JQuery:
Lorsque vous créez un nouveau chart.js toile, cela génère un nouveau iframe caché, vous devez supprimer la toile, les ans les iframes.
de référence:
https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
Pour moi cela a fonctionné:
JS:
Chart.js a un bug:
Chart.controller(instance)
enregistre tout nouveau graphique dans une propriété globaleChart.instances[]
et le supprime de cette propriété sur.destroy()
.Mais à la création de graphique Chart.js écrit aussi
._meta
propriété dataset variable:et il ne faut pas supprimer cette propriété sur
destroy()
.Si vous utilisez votre ancien objet dataset sans enlever
._meta property
, Chart.js va ajouter un nouveau dataset pour._meta
sans suppression des données précédentes. Ainsi, lors de chaque graphique de la ré-initialisation de votre objet dataset s'accumule toutes les données précédentes.Afin d'éviter cela, détruire un objet dataset après l'appel de
Chart.destroy()
.Cela a fonctionné pour moi.
Ajoutez un appel à clearChart, en haut de votre updateChart()
Depuis détruire genre de détruit "tout", un simple et bon marché de solution quand tout ce que vous voulez vraiment est juste "réinitialiser les données". La réinitialisation de votre jeux de données à un tableau vide fonctionnera parfaitement bien ainsi. Donc, si vous avez un dataset avec des étiquettes, et un axe de chaque côté:
Après cela, vous pouvez simplement appeler:
ou, selon si vous utilisez un 2d dataset:
Il va être beaucoup plus léger que de détruire complètement toute votre graphique/dataset, et la reconstruction de tout.