繁体   English   中英

流星和ChartJS动态创建图表

[英]Meteor and ChartJS dynamically create a chart

我目前正在与Meteor合作一个项目。 它用于创建,编辑,删除和投票。 现在,我想拥有一个页面,您可以在其中看到“ ChartJS”显示的答案的结果。

我得到以下代码:模板:

<template name="pollAnalysis">
    <h3>Auswertung {{title}}</h3>

    {{#each questions}}
        {{> questionAnalysis}}
    {{/each}}
</template>

<template name="questionAnalysis">
    <div class="post">
        <div class="post-content">
            <h3>{{question}}</h3>
            {{> analysisChart}}
        </div>
    </div>
</template>

<template name="analysisChart">
    <canvas id="{{_id}}" class="mychart" height="400" width="400"></canvas>
</template>

助手:

Template.pollAnalysis.helpers({
    questions: function(){
        return Questions.find({pollId: this._id});
    }
});

首先,我遇到了chartjs无法显示的问题,我通过执行此操作将其修复(仅针对单个ID,多数民众赞成在其中卡住)

Template.analysisChart.rendered = function(){
  drawChart();
}

function drawChart(){

  var data = [
    {
        value: 10,
        color:"#27AE60",
        highlight: "#2ECC71",
        label: "trifft zu"
    },
    {
        value: 10,
        color: "#16A085",
        highlight: "#1ABC9C",
        label: "trifft eher zu"
    }
]

  var ctx = $("#Cb8CdtDpdKA9y4Hij").get(0).getContext("2d");
  var myNewChart = new Chart(ctx);

  new Chart(ctx).Pie(data);
}

现在,我需要动态绘制图表。

伪代码:

function drawChart(questionId){

  var data = [
    {
        value: Questions_Users.find({questionId: questionId}, answer: "yes").count(),
        color:"#27AE60",
        highlight: "#2ECC71",
        label: "trifft zu"
    },
    {
        value: Questions_Users.find({questionId: questionId}, answer: "no").count(),
        color: "#16A085",
        highlight: "#1ABC9C",
        label: "trifft eher zu"
    }
]

  var ctx = $("#"+questionId).get(0).getContext("2d");
  var myNewChart = new Chart(ctx);

  new Chart(ctx).Pie(data);
}

因此,我必须将Template.analysisChart.rendered中的questionId交给drawChart()函数。 但是,如何在Template.analysisChart.rendered函数中获取当前元素的问题ID(在analysisChart模板中为“ {{_id}}”)?

问候和快乐编程faebuk

一个快速的答案是使用类似

Template.analysisChart.rendered = function(){
  Tracker.autorun(function(){
   var data = Questions_Users.find();
   drawChart();
  })
}

或研究observeChanges,例如:

Template.analysisChart.rendered = function(){
  Questions_Users.find().observeChanges({
   added:function(id, fields){
    //update Chart.datasets
    Chart.update()
   }
  })
}

我有一个示例项目,该项目仅使用Tracker和ReactiveArray实现了更新逻辑(tracker是Meteor前端的一部分,ReactiveArray与具有获取功能的Minimongo相似): https : //github.com/Slava/jsconf-asia-demo /blob/master/tracker.html#L47-L61

为了使它适应Meteor应用程序,您将在模板的rendered回调中启动自动运行,并依赖于您获取并提供给Chart.js的minimongo查询。 完成后,告诉Chart.js进行自我更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM