代码之家  ›  专栏  ›  技术社区  ›  Joao Alves Marrucho

如何在没有“魔力”的情况下(使用vuecharts.js),将数量可变的数据集推送到图表数据中?

  •  0
  • Joao Alves Marrucho  · 技术社区  · 6 年前

    我正在使用charts.js for Vue并尝试将数量可变的数据集(包含背景颜色、数据和标签)推送到一个图表中。数据对象应该记录如下内容:

    enter image description here

    但是,数据集记录了一个额外的观察者对象,并且图表没有呈现。

       let dynamicDataCollection = [];
            for (i =0; i < allDeptNames.length; i++) {
                let datasets = [
                    {
                    label: allDeptNames[i],
                    backgroundColor: barColours[i],
                    data: [spaceIterationIns[i].length] 
                    }
                ]
                dynamicDataCollection.push(datasets);
            }
            that.datacollection2 = {
                labels: ['Weekly'],                
                datasets: [                              
                ]
            }
            that.datacollection2.datasets = dynamicDataCollection;
            console.log(that.datacollection2);
    

    这是我的数据对象:

    data () {
        return {
            windowWidth: 0,
            windowHeight: 0,
            datacollection2: null,
            chartData: { 
    
            }, chartOptions: {
    
            }         
        }
    },
    

    这是我的模板:

         <charts  v-if="last7DaysSelected" ref="visits_per_dept_bar"
                 :css-classes="'visitsChart_bar'" 
                 :chart-id="'visits_per_dept_bar'" 
                 :height="150" 
                 :options="chartOptions"
                 :chart-data="datacollection2" 
    
          ></charts>
    

    import {Line, mixins } from 'vue-chartjs'
    Chart.defaults.global
    let chartOptions = Chart.defaults.global;
    chartOptions.defaultFontFamily= "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Helvetica Neue', sans-serif"
    
    const { reactiveProp } = mixins
    export default {
      extends: Line,
      mixins: [reactiveProp],
      props: ['options'],
    
      mounted () {
        let that = this;
    
        that.chartOptions = { 
          scales: {
            yAxes: [{
                ticks: {
                    suggestedMin: 0,      
                },       
            }],
            xAxes: [{
                ticks: {
                    suggestedMin: 0,    
                },
            }],
        },
        legend: {
            labels: {
                fontColor: 'rgb(168, 119, 181)',
            }
        }
      },
        this.renderChart(this.chartData, that.chartOptions)
      }
    }
    

    这就是我得到的东西。。。 the vue Observer object is prying

    展开视图: Expanded view

    阻止{ob}对象太危险了。我已经试过了,vue.charts.js程序需要一些反应)。 有什么办法吗?也许是一个可以让你经历的技巧 for循环 内部 数据收集2 反对?而不是将数据集对象推送到 数据收集2 ? 有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Andrey Popov    6 年前

    使用 options 取而代之的是:

    name: 'myComponent',
    data: () {
      return {
        some: 'properties'
      }
    },
    nonReactiveData: {
      whatever: 'you like'
    }
    

    这基本上是用 option 命名 nonReactiveData

    <some-component :data="$options.nonReactiveData">
    

    或者如果你在剧本中需要它:

    methods: {
      someMethod() {
        console.log(this.$options.nonReactiveData)
      }
    }
    

    希望有帮助:)

        2
  •  0
  •   Joao Alves Marrucho    6 年前

    通过连接dynamicDataCollection对象修复了此问题:

         that.dynamicDataCollection = [];
            for (i =0; i < allDeptNames.length; i++) {
                let datasets = [
                    {
                    label: allDeptNames[i],
                    backgroundColor: barColours[i],
                    data: [spaceIterationIns[i].length] 
                    }
                ]
                that.dynamicDataCollection.push(datasets);
            }
    // here
            let dynamicFlat = [].concat.apply([], that.dynamicDataCollection)  
            that.datacollection2 = {
                labels: ['Weekly'],                
                datasets: [                           
                ]
            }
    // and then here
            that.datacollection2.datasets = dynamicFlat;