【问题标题】:AmCharts dataloader doesn't work with generate series plugin using stock chartAmCharts 数据加载器不适用于使用股票图表生成系列插件
【发布时间】:2018-02-03 19:11:14
【问题描述】:

我正在加载适用于 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。

【问题讨论】:

    标签: amcharts


    【解决方案1】:

    您链接到的插件并非旨在与数据加载器一起使用,但您可以通过遵循 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
      ],
      // ...
    });
    

    【讨论】:

    • 亲爱的坦克很多关于您的反馈,它对我有用,另一个问题发生在我身上,当我将两个 amstock 放入 html 页面时,我收到错误 AS:未捕获 RangeError:超出最大调用堆栈大小
    • 请提供能重现此内容的 jsfiddle 或 codepen。
    • 亲爱的,我尝试让两个 js 文件与我的项目相同,但其中不可能 codepen.io/artamoeini/details/paydEN ,我也在此代码笔的评论中解释了我的内容文件和 html 内容
    • 您必须为第二个图表 div 定义宽度和高度。您只有 #chartdiv 的 CSS,因此为 #chartdiv1 添加附加规则将解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多