2017-10-25 1 views
1

Wie soll ich auf das Diagramm in einer Vue-Chart-Instanz verweisen und es zerstören? Ich habe versucht:rerender chart in vue-chart

var chartVue = new Vue({ 
    el: '#chart', 
    extends: VueChartJs.Line, 
    data: { 
    chartData: {...}, 
    options: {...} 
    }, 
    mounted() { 
    this.renderMyChart() 
    }, 
    methods: { 
    renderMyChart: function() { 
     this.renderChart(
     this.chartData, 
     this.options 
     ); 
    } 
    }, 
    watch: { 
    chartData: function() { 
     this._chart.destroy(); 
     this.renderMyChart(); 
    } 
    } 
}); 

Aber es klagt

TypeError: Cannot read property 'destroy' of undefined

So scheint es this._chart ist nicht der richtige Weg, um die aktuellen Chart zu beziehen, jeder weiß, was der richtige Weg ist, dies zu tun? Die Idee kommt von this stack overflow answer.

+0

' this._chart' ist die richtige Referenz, also bin ich mir nicht sicher, warum es zu diesem Zeitpunkt "undefiniert" wäre. Sie können aber auch einfach das 'reactiveData'-Mixin verwenden, das genau das tut, was Sie tun möchten: http://vue-chartjs.org/#/home?id=reactive-data – thanksd

+0

Hi @thanksd, danke für die Antwort. Ich habe mir 'Mixins' angeschaut, bin mir aber nicht sicher, wie ich es direkt in einer Vue-Instanz verwenden kann. Das Beispiel zeigt, wie es in einer vue-Komponente verwendet wird. Weißt du wie ich hier reactiveProp benutzen kann? – Psidom

+1

Fügen Sie einfach 'mixins: [VueChartJs.mixins.reactiveData],'. Und beachte, dass es "reactiveData" und nicht "reactiveProp" sein muss, da du 'chartData' in deinem Datenobjekt definiert hast und nicht als proprietär. Beispiel: https://jsfiddle.net/fuj4yqke/ – thanksd

Antwort

2

Das Objekt Chart, auf das über this._chart zugegriffen werden kann, wird erst eingestellt, nachdem die Methode renderChart aufgerufen wurde. Was am wahrscheinlichsten passiert, ist, dass Ihre chartData irgendwie aktualisiert wird, bevor diese renderChart Methode aufgerufen wurde. Der Wächter für chartData verweist also auf this._chart, bevor er definiert wurde.

Allerdings hat vue-chartjs eine eingebrannte Möglichkeit, das Diagramm neu zu rendern, wenn sich die abhängigen Daten ändern: reactiveData and reactiveProp mixins. Wenn Sie eines dieser Mixins hinzufügen, werden die Änderungen an der chartData (Dateneigenschaft bzw. Prop) das Diagramm erneut rendern, um die aktualisierten Daten wiederzugeben.

sollten Sie verwenden die reactiveData mixin statt:

var chartVue = new Vue({ 
    el: '#chart', 
    extends: VueChartJs.Line, 
    mixins: [ VueChartJS.mixins.reactiveData ], 
    data() { 
    return { 
     chartData: {...}, 
     options: {...} 
    } 
    }, 
    mounted() { 
    this.renderChart(this.chartData, this.options); 
    }, 
}); 
0

Es scheint this._chart zu this._data._chart bewegt wurde, so zum Beispiel die Optionen reaktiv zu machen, einen Beobachter wie folgt hinzufügen:

watch: { 
    options: function() { 
     this._data._chart.destroy(); 
     this.renderChart(this.chartData, this.options); 
    } 
}