AmCharts.ready não está pronto quando carregado de forma assíncrona
-
20-12-2019 - |
Pergunta
Inicialmente coloquei todas as configurações do AmChart em AmCharts.ready e tudo funcionou bem.
<script src="amcharts/amcharts.js" type="text/javascript"></script>
<script src="amcharts/serial.js" type="text/javascript"></script>
<script>
AmCharts.ready(function() {
console.log("this works");
/* Other configs */
})
</script>
De alguma forma, ele para de funcionar quando apresento o RequireJS conforme as instruções em amCharts atende ao requireJS.Qualquer código dentro do retorno de chamada do AmChart.ready não será executado.(Estranhamente, foi executado uma vez durante a depuração)
Solução
Depois de alguns testes, percebi que AmChart.ready apenas envia o retorno de chamada para o onReadyArray
que é posteriormente exibido para execução após o evento window.load/onload.Em outras palavras, se o AmChart for carregado após o evento window.onload, o AmChart.ready será inútil.Minha solução alternativa é a seguinte:
<script>
configChart = function() {
/* Create charts stuff */
};
if (AmCharts.isReady) {
configChart();
} else {
AmCharts.ready(configChart);
}
</script>
Outras dicas
Ainda não funciona em versões mais recentes (versão 3.14.1 no momento), mas o que corrige é chamar o handleLoad
método manualmente:
AmCharts.handleLoad();
Chamar várias vezes também não parece causar nenhum dano.
Como eu carrego nos gráficos de forma assíncrona, eu precisava definir manualmente "amCharts.isready = true;" Antes de chamar minhas funções de AmCharts.Por exemplo:
var chartData1 = [];
function generateChartData() {
...
}
function createStockChart() {
...
}
if ($('.amChartDivExists').length > 0) {
AmCharts.isReady = true;
generateChartData();
createStockChart();
}