javascript NVD3 - 如何刷新数据功能以在点击时生成新数据

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24689157/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 03:14:40  来源:igfitidea点击:

NVD3 - How to refresh the data function to product new data on click

javascriptd3.jsnvd3.js

提问by dvoutt

I have a line chart and every time the page refresh it changes the data, which is great but I need to to refresh by a user click. This is because there will eventually be other input fields on the page and refreshing the page would destroy their current session.

我有一个折线图,每次页面刷新时它都会更改数据,这很好,但我需要通过用户单击来刷新。这是因为页面上最终会有其他输入字段,刷新页面会破坏它们的当前会话。

jsfiddle - http://jsfiddle.net/darcyvoutt/dXtv2/

jsfiddle - http://jsfiddle.net/darcyvoutt/dXtv2/

Here is the code setup to create the line:

这是创建该行的代码设置:

function economyData() {  

    // Rounds
    var numRounds = 10;

    // Stability of economy
    var stable = 0.2;
    var unstable = 0.6;
    var stability = unstable;

    // Type of economy
    var boom = 0.02;
    var flat = 0;
    var poor = -0.02;
    var economyTrend = boom;

    // Range    
    var start = 1;
    var max = start + stability;
    var min = start - stability;

    // Arrays
    var baseLine = [];
    var economy = [];

    // Loop
    for (var i = 0; i < numRounds + 1; i++) {    

      baseLine.push({x: i, y: 1});

      if (i == 0) {

        economyValue = 1;

      } else {

        var curve = Math.min(Math.max( start + ((Math.random() - 0.5) * stability), min), max);        

        economyValue = Math.round( ((1 + (economyTrend * i)) * curve) * 100) / 100;

      }

      economy.push({x: i, y: economyValue});

    }

    return [
      {
        key: 'Base Line',
        values: baseLine   
      },
      {
        key: 'Economy',
        values: economy  
      }
    ];
  }

Here is what I tried to write but failed for updating:

这是我尝试编写但更新失败的内容:

function update() {
      sel = svg.selectAll(".nv-line")
      .datum(data);

      sel
        .exit()
        .remove();

      sel
        .enter()
        .append('path')
          .attr('class','.nv-line');

      sel
        .transition().duration(1000);

  };

  d3.select("#update").on("click", data);  

回答by shabeer90

Here is what I did differently with your code.

这是我对您的代码所做的不同之处。

// Maintian an instance of the chart 
var chart; 

// Maintain an Instance of the SVG selection with its data
var chartData;

nv.addGraph(function() {
    chart = nv.models.lineChart().margin({
        top : 5,
        right : 10,
        bottom : 38,
        left : 10
    }).color(["lightgrey", "rgba(242,94,34,0.58)"])
        .useInteractiveGuideline(false)
        .transitionDuration(350)
        .showLegend(true).showYAxis(false)
        .showXAxis(true).forceY([0.4, 1.6]);

    chart.xAxis.tickFormat(d3.format('d')).axisLabel("Rounds");
    chart.yAxis.tickFormat(d3.format('0.1f'));

    var data = economyData();

    // Assign the SVG selction
    chartData = d3.select('#economyChart svg').datum(data);
    chartData.transition().duration(500).call(chart);

    nv.utils.windowResize(chart.update);

    return chart;
});

Here's how the update()function looks like:

下面是update()函数的样子:

function update() {
    var data = economyData();

    // Update the SVG with the new data and call chart
    chartData.datum(data).transition().duration(500).call(chart);
    nv.utils.windowResize(chart.update);
};

// Update the CHART
d3.select("#update").on("click", update);

Here is a link to a working versionof your code.

这是指向您的代码的工作版本的链接。

Hope it helps.

希望能帮助到你。