AmCharts数据加载器不能使用股票图表生成系列插件

时间:2018-02-03 19:11:14

标签: amcharts

我正在加载在AmCharts插件中工作的JSON,但是我无法使用外部JSON和股票图表。我在这里使用此示例中的代码:https://www.amcharts.com/kbase/automatically-generate-series-graphs-data-stock-chart/

我正在使用下面的dataLoader配置:

"dataLoader": {
  "url": "data/MSFT.json", 
  "format": "json", 
  "showCurtain": true, 
  "showErrors": true, 
  "async": true
}

当我的数据直接在dataProvider中作为静态JSON提供但不使用dataLoader时,插件可以正常工作。

1 个答案:

答案 0 :(得分:0)

您链接的插件并非设计用于数据加载器,但是您可以通过将主要逻辑包装到datePadding plugin来执行一些微小调整以使其更好地使用它一个可以稍后调用的函数,然后在将调用附加到dataLoader的完整回调之前添加一些代码来检查dataLoader是否存在:

AmCharts.addInitHandler(function(chart) {  
  function generateGraphsFromSeries(chart) { 
    //original logic here
  }
  //determine whether the dataloader is used or not
  /**
     * Stock or Serial chart?
     */
    if ( chart.type === "stock" ) {

        // check each data set if there's a Data Loader active
        var loader;
        for ( var i = 0; i < chart.dataSets.length; i++ ) {
            if ( chart.dataSets[ i ].dataLoader !== undefined && chart.dataSets[ i ].dataLoader.url !== undefined ) {
                loader = chart.dataSets[ i ].dataLoader;
            }
        }

        // is there at least one data loader?
        if ( loader === undefined ) {
            // nope - let's go with processing
            generateGraphsFromSeries( chart );
        } else {
            // yeah - let's use the last data loader's complete event
            if ( loader.complete ) {
                loader._complete = loader.complete;
            }
            loader.complete = function( chart ) {
                // call original complete
                if ( loader._complete )
                    loader._complete.call( this, chart );

                // now let's do our thing
                generateGraphsFromSeries( chart );
            }
        }

    } else if ( chart.stockChart === undefined && chart.id !== "scrollbarChart" ) {

        // check for Data Loader
        var loader = chart.dataLoader;
        if ( loader !== undefined && loader.url !== undefined ) {
            if ( loader.complete ) {
                loader._complete = loader.complete;
            }
            loader.complete = function( chart ) {
                // call original complete
                if ( loader._complete )
                    loader._complete.call( this, chart );

                // now let's do our thing
                generateGraphsFromSeries( chart );
            }
        } else {
            generateGraphsFromSeries( chart );
        }

    }
}, ["serial", "stock"]);

这里有updated demo,演示了如何使用外部JSON文件。

另请注意,股票图表期望dataLoader位于dataSets数组中的dataSet对象内,与串行图表不同:

AmCharts.makeChart("...", {
  type: stock,
  // ...
  dataSets: [{
    dataLoader: {
      // config
    },
    //rest of the config here.
  },
    // repeat for each dataSet
  ],
  // ...
});