2016-12-08 3 views
0

Я работаю с диаграммами Google и испытываю некоторые недоразумения.setOnLoadCallback не работает в цикле

Чтобы быть коротким, у меня есть много диаграмм для рисования, и вместо их перечисления я хотел бы создать цикл. Но когда я конвертирую «список вызовов» в цикл for..in, только последний элемент в массиве, похоже, «работает».

Здесь вы можете увидеть объект, называемый «allData», который содержит много данных и функцию для вызова при запуске «OnLoad».

for (var value in allData) { 
    google.charts.setOnLoadCallback(function() { (allData[value]['function'])(allData[value]) }); 
}; 

//google.charts.setOnLoadCallback(function() { (allData['ActionsBar']['function'])(allData['ActionsBar']) }); 
// google.charts.setOnLoadCallback(function() { (allData['OtherBar']['function'])(allData['OtherBar']) }); 
// google.charts.setOnLoadCallback(function() { (allData['ThirdBar']['function'])(allData['ThirdBar']) }); 

Если я раскомментирую последние 3 строки, все будет хорошо. Я читал, что он, похоже, знал проблемы с диаграммами и циклами Google, но не смог найти именно этот случай. Есть идеи ?

ответ

-1

Я думаю, вы должны вызвать setOnLoadCallBack только один раз

google.charts.setOnLoadCallback(myCallBackFunction()); 
myCallBackFunction = function(){ 
    for (var value in values) { 
     var data = //use value or what you want 
     var options = //use value or what you want 
     var chart = new google.visualization. //etc etc 
     chart.draw(data,options) 
    } 
} 
+0

Здравствуйте, я не думаю да. То, что вы мне сказали, делается с помощью функции лямбда: 'function() {(allData [значение] ['function']) (allData [значение])}' (Плюс ваш код не так, как вы «вызовите» myCallBackFunction, где вы должны просто передать его как параметр). Или, может быть, я не понял, что вы имели в виду. –

+0

Только последний цикл работает, потому что каждый раз, когда вы вызываете .setOnLoadCallback, он удаляет предыдущий – grogro

+0

Вы уверены? Почему он не стирает предыдущий, когда я делаю последовательные звонки? И есть ли способ исправить это, вы думаете? –

0

setOnLoadCallback следует называть только раз на странице загрузки

цель состоит в том, чтобы вы знаете google закончил погрузку, вдоль с домом

Требуется ссылка в функции

google.charts.setOnLoadCallback(drawChart);

не является результатом функции

google.charts.setOnLoadCallback(drawChart());


однако, рекомендуем не использоватьsetOnLoadCallback все равно

установи callback в loadвместо

Google нагрузки первой, то не беспокойтесь об этом больше ...

google.charts.load('current', { 
    callback: drawChart, 
    packages: ['corechart'] 
}); 
+0

oooh Я думаю, что получил. У меня появилась идея. Попробуй, и я покажу тебе. Я уверен, что это сработает. –

+0

Хорошо, работает. Juste changer this: 'for (значение var in allData) { google.charts.setOnLoadCallback (function() {(allData [значение] ['function']) (allData [значение])}); }; ' от ' google.charts.setOnLoadCallback (функция() { для значения (вар в ALLDATA) { (ALLDATA [значение] [ 'функция']) (ALLDATA [значение]); }; }); ' и все в порядке! –

0

я, наконец, узнал. Как я уже сказал,

google.charts.setOnLoadCallback 

должен вызываться только один раз, поэтому я изменил

for (var value in allData) { 
    google.charts.setOnLoadCallback(function() { (allData[value]['function'])(allData[value]) }); 
}; 

по

google.charts.setOnLoadCallback(function() { 
     for (var value in allData) { 
      (allData[value]['function'])(allData[value]); 
     }; 
     }); 

Все хорошо сейчас;)

Смежные вопросы