我试图不必使用名为' data'
的全局变量在我的js文件中,我现在有了这个功能:
var Module_BarDataDaily = (function() {
var data;
d3.csv("myData.csv", function(rows) {
data = rows;
});
return {
dataX: data
}
})();
我当时(可能错误地)认为我可以通过Module_BarDataDaily.dataX
访问此数据 - 所以在后续功能中我执行以下操作:
function TOPbarChart(
grp, meas, colorChosen) {
TOPbarData = Module_BarDataDaily.dataX.map(function(d) { //line 900
return { ...
控制台然后在以下第900行给出了一个例外:
TypeError: Module_BarDataDaily.dataX is undefined
我做错了什么?我该如何解决?
答案 0 :(得分:1)
这里的问题是d3.csv
是异步的,因此数据的填充时间与访问时间不同。
如果您想运行d3.csv
一次,获取数据并将其保存在其他位置,您可以尝试this或this或this
一般来说:
// define your module here
var Module_BarDataDaily = function(data) {
this.dataX = data; //this.dataX will store the data
this.process = function(){// do whatever you need afterwards
console.log(this.dataX);
}
};
var process = function(myModule){
// or use another function to do what you need etc
console.log(myModule.dataX);
}
// load your csv once and save the data
d3.csv("path/to/your.csv", function(error, data) {
// after some proper error handling...
var myModule = new Module_BarDataDaily(data);
// so then you can do anything after that and
// your myModule will have data without calling d3.csv again
myModule.process();
//or
process(myModule);
});
希望这有帮助! 祝你好运!
答案 1 :(得分:0)
我根据mkaran的回答使用了以下内容:
var Module_BarDataDaily = function(data) {
this.dataX = data;
};
d3.csv("data/BarChart_data.csv", function(error, rows) {
var myModule = new Module_BarDataDaily(rows);
var chart = barChart();
chart.render(myModule.dataX);
d3.selectAll('input[name="meas"]').on("change", function change() {
chart.currentMeasure(this.value)
chart.render(myModule.dataX);
});
});